这是这个问题( custom UIView how-to with IB / Xcode 4.5.1 and iOS Simulator 6.0 )的后续,但没有必要阅读 - 这是我第一次尝试创建自定义 UIView 并且显然我没有提前得到任何帮助,你可以提供。

我有一个从 Interface Builder 派生的自定义 UIView。我想将设置的大小设置为 200w x 200h,将 backgroundColor 设置为绿色。当我创建时,我做了以下事情:

  • 通过 File -> New -> Objective-C Class 创建了一个新的自定义 UIView,名为 Tview
  • 通过 File -> New -> User Interface -> View 创建了一个新 View 并将其命名为 tnib
  • 在 Canvas 中,我删除了 View 并从对象检查器中添加了一个新 View 并将类名设置为 Tview。此外,在属性检查器中,我将大小设置为 Freeform,将背景颜色设置为绿色。在 Size Inspector 中,我将宽度设置为 200,将高度设置为 200。

  • 在我的 Tview.m 中,我设置了以下内容(我根据其他 SO 问题进行了一些更新,但尚不清楚这些问题是否仍然是最新的或准确的):
    @implementation Tview
    
    -(id) initWithCoder:(NSCoder *)aDecoder
    {
      NSLog(@"in initWithCoder");
      if((self = [super initWithCoder:aDecoder])) {
        [self setUpView];
        }
      return self;
    }
    
    -(void)awakeFromNib
    {
      NSLog(@"in awakeFromNib");
      [self setUpView];
    }
    
    -(void)setUpView
    {
        NSLog(@"I am in setUpView");
        NSArray *subviewArray=[[NSBundle mainBundle] loadNibNamed:@"tnib" owner:self options:nil];
        UIView *mainView = [subviewArray objectAtIndex:0];
        [self addSubview:mainView];
    }
    
    @end
    

    在我的 ViewController.xib 中,我拖出一个 UIView 并将自定义类名称设置为 Tview。我 #import Tview.h 文件并从 ViewController.xib 拖动到 Tview.h 并创建以下属性:
    @property (strong, nonatomic) IBOutlet Tview *myTview;
    

    我构建并运行并获得以下无限循环:
    2013-03-04 06:49:05.452 Nibtest2[44524:11303] in initWithCoder
    2013-03-04 06:49:05.455 Nibtest2[44524:11303] I am in setUpView
    2013-03-04 06:49:05.456 Nibtest2[44524:11303] in initWithCoder
    2013-03-04 06:49:05.458 Nibtest2[44524:11303] I am in setUpView
    2013-03-04 06:49:05.459 Nibtest2[44524:11303] in initWithCoder
    2013-03-04 06:49:05.460 Nibtest2[44524:11303] I am in setUpView
    

    直到它最终崩溃。

    我在这里做错了什么?

    提前谢谢

    最佳答案

    您的代码设置了无限递归: initWithCoder: 调用 setUpView ,它从包中实例化一个新的 UIView ,从而间接调用 initWithCoder: 并完成循环。

    您不应在读​​取相同 NIB 时调用的代码中访问 NIB。您应该在包含对象的代码中读取 NIB,而不是在 Tview 对象本身的代码中。否则,你会得到一个无限循环。

    您需要完全远程 setUpView 以及来自 awakeFromNibinitWithCoder: 的调用。似乎您通过从对象检查器中拖出而在界面构建器中建立的连接已经导致 NIB 文件正确加载,如 initWithCoder: 的调用所证明的那样。您可能需要的唯一一行是:

    [self addSubview:mainView];
    

    但是,它不应该在 Tview 的代码中:它需要移动到具有 myTview 属性的父 Controller ,并且应该修改为
    [self.view addSubview:_myTview];
    

    将此行添加到 viewDidLoad 。它应该解决这个问题。

    关于ios - 尝试从 IB 中的 xib 创建自定义 View 的无限循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15204547/

    10-10 03:52