使用自定义视图与故事板而不添加两次

时间:2014-01-12 00:39:29

标签: ios iphone objective-c

我正在使用Storyboard并尝试将View重用于不同的ViewControllers。

为此,我创建了一个自定义.xib(MyCustomView.xib)和类(MyCustomView),几乎无处不在。

在我的Storyboard中,我将自定义视图设置为MyCustomView类型。

MyCustomView.xib中,将第一响应者设置为MyCustomView

MyCustomView.m中,我添加了以下方法:

-(id)initWithCoder:(NSCoder *)aDecoder{
    if ((self = [super initWithCoder:aDecoder])){
        UIView *myCustomView = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil] objectAtIndex:0];
        [self addSubview: myCustomView];
    }
    return self;
}

问题是,[self addSubview: myCustomView]向现有MyCustomView添加了新的MyCustomView,因此视图会被添加两次。

我怎样才能摆脱其中一个?

修改

我的问题不是很清楚,所以我认为一些屏幕上限会有所帮助。

这是我的故事板,带有自定义视图。自定义类设置为MyCustomViewStoryboard with MyCustomView

(我还添加了灰色背景和标签,仅用于测试目的)

现在,在MyCustomView.xib中,我将文件的所有者设置为类MyCustomViewMyCustomView.xib

为标题Label和imageView添加插座: MyCustomView.xib

使用上面写的initWithCoder方法,这工作正常,除了我调试时我可以看到: MyCustomView.m 因此,self当然是类型MyCustomView,如故事板中所选,但它包含2个子视图:

  • 首先是我的故事板上的测试标签
  • 其次是来自MyCustomView.xib的视图,其中包含标签和图像视图。 这就是我想要摆脱的观点

1 个答案:

答案 0 :(得分:0)

什么是 self

在这里,您刚刚实例化了MyCustomView。因此,您要将新的UIView(而不是MyCustomView)添加到由 initWithCoder 方法创建的新MyCustomView实例中。

initWithCoder 是加载Storyboard视图时调用的方法。

如果要在MyCustomViewController 中实例化新的MyCustomView ,则必须调用

MyCustomView *newInstance = [[MyCustomView alloc] init];
[self addSubview:newInstance];

其中 self 是故事板中MyCustomViewController的实例。


修改

好的,我更了解你的问题。 如果要加载MyCustomView nib文件,则无需为其创建类(除非您要在其中访问特定变量)。 只是做你在这里做的事情,但在视图控制器中,它将是 self 。 :)

您可能需要查看:How to load a UIView using a nib file created with Interface Builder


编辑2

好的,我想我明白了:

  • 删除Storyboard中的MyCustomView。
  • 创建一个类MyView或您附加到Storyboard中名为“View”的视图的任何内容。
  • 在您的类的init方法中,您实例化MyCustomView nib
  • 将生成的UIView添加到视图堆栈中。

self 将是MyView(出现在Storyboard中),MyCustomView不会出现在故事​​板中,而是以编程方式在MyView.h的init方法中创建

您必须以编程方式添加约束。以下是可能有用的帖子:Adding View Programatically With Auto Layout Gives 'NSGenericException', reason: 'Unable to install constraint on view