2014-01-12 26 views
2

我正在使用故事板,并试图重用视图的不同ViewControllers。为此,我创建了几乎随处可见的自定义.xib(MyCustomView.xib)和类(MyCustomView)。使用自定义视图与故事板而不添加两次

在我的故事板中,我将自定义视图设置为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,我设置文件的所有者是MyCustomView类: MyCustomView.xib

并添加网点标题标签和imageView: MyCustomView.xib

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

  • 首先是从我的故事板
  • 第二测试标记是从MyCustomView.xib,含有本身的视图标签和图像视图。 这就是我想摆脱的这种看法。
+0

另一种方法是在故事板中完成所有操作 - 在一个控制器中创建自定义视图,然后将其复制并粘贴到其他控制器中(删除他们的默认视图,粘贴之前)。 – rdelmar

+0

这可能会更容易,但是每次我在控制器中修改视图时,都必须相互修改它,这就是为什么我需要它在.xib文件中。 – Damien

回答

0

什么是self

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

initWithCoder是加载故事板视图时调用的方法。

如果你想实例化一个新MyCustomView 在MyCustomViewController你必须调用

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

自我是MyCustomViewController的情况下在你的故事板。


编辑

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

你可能想看看:How to load a UIView using a nib file created with Interface Builder


EDIT 2

好吧,我想我明白了:

  • 删除故事板中的MyCustomView。
  • 创建一个MyView类或您附加到Storyboard中名为“View”的视图的任何内容。
  • 在你的类的init方法中,你实例化你的MyCustomView笔尖
  • 将结果UIView添加到视图堆栈中,就像你做的那样。

将MyView的(故事板存在),MyCustomView不会出现在故事​​板,但在MyView.h

的init方法编程方式创建你将不得不以编程方式添加约束。这是一个有用的帖子:Adding View Programatically With Auto Layout Gives 'NSGenericException', reason: 'Unable to install constraint on view

+0

是的,我很抱歉,我正在向MyCustomView添加一个新的UIView。但如何摆脱这个特定的UIView?导致在我的.xib文件中,它代表MyCustomView ... 谢谢 – Damien

+0

简单化:-)如果您在XCode中开始一个新项目,则默认视图将在Storyboard中为UIView类型。如果你希望它是MyCustomView类型的,你只需要在右侧面板中输入它(第三个选项卡 - >自定义类)。 **不要在自定义视图类**的init中实例化新视图。如果你想在其他地方实例化一个新的视图,就像我在这个答案中写的一样。 –

+0

我编辑我的问题与屏幕帽,因为我害怕它不是很清楚。我确实有特定的变量,所以我需要一个类。此外,我喜欢我的方法,因为我不必在视图控制器中添加任何代码(它只能由故事板和我的窗口小部件视图处理)。 – Damien

相关问题