2009-05-25 37 views
3

作为一个新手,IB和所有可能的连接都让我感到困惑。我发现的大多数教程都是我称之为意大利面代码的转世,其中纠缠是所有通过拖动创建的连接。当然,我想用IB来布置视图(设置可视元素的大小为&),这就是IB很棒的原因。但是一个控制器不是一个视图,所以如果我的所有控制器都是代码并且不出现在IB中的任何位置,那么它就不那么令人困惑了。我怀疑这会减少意大利面。它还鼓励每个视图提供一次警告。为此,以下是问题,我在哪里可以找到符合此策略的示例项目?如何让控制器脱离xib

回答

1

好问题。我试图坚持的模式是在代码中创建控制器,为XIB/NIB中与代码交互的事物添加IBOutlets和IBActions,并在控制器的构造函数中加载XIB/NIB为“self”的事物为所有者和IB中的东西连接到“文件所有者”占位符,我的身份将被指定为我的控制器类。

4

我没有一套示例项目,但我会给你提供一些有关事情如何工作以及何时应该在XIB文件或代码中创建控制器的信息。

如果您的控制器是通过用户操作动态创建的,那么您通常不会在XIB文件中实例化它们。相反,你会像上面提到的危害一样在代码中实例化它们。一旦你这样做了,你仍然需要一种机制将这个在代码中创建的控制器连接到你在IB中创建的用户界面元素。

IB提供解决此问题的机制是文件所有者。掌握文件的所有者对于“获取”Interface Builder是必不可少的。

该文件的所有者不是“在”XIB文件中的对象,而是在XIB文件中表示的对象。它是加载XIB文件时已经存在的对象的占位符。当运行时加载NIB文件时,它们将加载NSBundle方法 - [NSBundle loadNibNamed:ownwer:options:]。 owner参数用于解析XIB/NIB文件中文件的所有者占位符对象。当文件在运行时加载时,针对文件所有者的所有连接将针对作为owner参数传入NSBundle方法的对象进行解析。在iPhone上,你通常不会自己加载NIB文件。相反,UIViewController为你做。 UIViewController的方法的loadView的默认实现可能是这个样子:

- (void)loadView { 
    [[self nibBundle] loadNibNamed:[self nibName] owner:self options:nil]; 
} 

所以,在你的XIB文件到文件的所有者连接的元素,你将它们连接到您的视图控制器。

您将有一些控制器静态地在您的应用程序中 - 他们将永远活着。导航或选项卡控制器及其根项目通常在其应用程序的整个生命周期内都存活。当这种情况发生时,我会在MainWindow.xib文件中设置这些视图控制器。大多数其他控制器将动态创建,并以编程方式响应用户的操作。

+0

谢谢乔恩,这是有用的信息。我仍然想尝试在IB方从未拥有控制器的策略。你会同意它是可行的吗?我仍然在寻找代码示例... – bedouger 2009-05-26 11:41:11