在界面构建器中添加的自定义UIView无法加载xib文件。

22

我已经创建了一个带有xib的自定义UIView

此外,我在我的storyboard中有一个UIViewController,我向其中添加了一个UIView并将其类设置为我的自定义UIView

但是当我运行应用程序时,视图没有子视图。调试时,所有子视图都为null。

在自定义UIView的.m文件中,存在以下初始化方法:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {

    }
    return self;
}

我漏掉了什么?


你是如何将自定义的UIVIew添加到你的ViewController中的? - Bordz
这里的“使用xib创建自定义UIView”是什么意思?您是否已经创建了一个xib文件,将自定义视图放置在根视图中并添加了子视图?现在您想将带有子视图的自定义视图用作故事板场景的根视图吗? - yurish
1个回答

33

如您所知,使用UIViewController我们可以使用-initWithNibName:bundle:方法将其与xib连接起来。
但是...
当涉及到UIView时,您需要使用-loadNibNamed:owner:options:方法并使用xib加载它。(仅在xib中指定视图的自定义类不起作用


假设:

  1. 创建了名为CustomXIBViewUIView子类
    • 新建文件 > Cocoa Touch > Objective-C类 - UIView的子类
  2. 创建了一个简单的视图用户界面,并将其命名为CustomXIBView
    • 新建文件 > 用户界面 > 视图

步骤:

  1. 进入CustomXIBView的nib文件
  2. 选择View左侧工具栏
  3. 选择Show Identity Inspector右侧面板中的第3个选项
  4. CustomXIBView指定为ViewCustom Class
    • 不要在nib中对CustomXIBViewFile's Owner进行任何操作
  5. 拖放对象并将其与CustomXIBView.h连接

代码:

//To load `CustomXIBView` from any `UIViewController` or other class: 
//instead of the following commented code, do the uncommented code
//CustomXIBView *myCustomXIBViewObj = [CustomXIBView alloc] init];
//[myCustomXIBViewObj setFrame:CGRectMake(0,0,320,480)];

//Do this:
CustomXIBView *myCustomXIBViewObj = 
     [[[NSBundle mainBundle] loadNibNamed:@"someView"
                                    owner:self
                                  options:nil]
                            objectAtIndex:0];
[myCustomXIBViewObj setFrame:CGRect(0, 
                                    0, 
                                    myCustomXIBViewObj.frame.size.width, 
                                    myCustomXIBViewObj.frame.size.height)];
[self.view addSubview:myCustomXIBViewObj];
ref: http://eppz.eu/blog/uiview-from-xib/

这个在UIViewController中也没有起作用:self.RODE_RULS_CategoryView = [[[NSBundle mainBundle] loadNibNamed:@"CategoryView" owner:self options:nil] objectAtIndex:0]; - Luda
1
@Luda 如果您使用Storyboard而不是编程方式创建自定义视图,则Storyboard运行时会使用initWithCoder方法而不是initWithFrame方法来初始化视图。因此,您应该在initWithCoder中创建子视图,或者最好创建一个具有通用初始化代码的创建方法,并从initWithCoder和initWithFrame中调用它。 - yurish
不,我没有说要以编程方式创建。实际上,您应该在IB中创建“subViews”,但是当您指定“Custom Class”时,应该在选择“View”而不是“File's Owner”之后指定它...就像这样:http://i.stack.imgur.com/nGAF0.png - staticVoidMan
2
嗨@staticVoidMan,您的提案可行:在IB中设置子视图,然后在uiviewcontroller中放置loadNibNamed。但是我正在寻找的(也许是错误的,也许这个选项甚至不存在)是创建自定义视图,然后在UIViewController的IB中拖动UIView输出口,将其类设置为我的自定义UIView,而不编写任何代码。这可能吗? - Luda
1
@staticVoidMan,我有5个类似这样的视图。我真的不想编写5次loadNibNamed代码。我只想在IB中拖放它们。 - Luda
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接