作为一个新手,IB和所有可能的联系让我感到困惑。我发现的大多数教程都是我称之为意大利面条代码的转世,其中纠缠是通过拖动创建的所有连接。当然,我想使用IB来布局视图(调整大小和放置视觉元素),这就是IB的优点。但是控制器不是一个视图,所以如果我的所有控制器都是单独的代码并且不会出现在IB的任何地方,那么它就不那么容易混淆了。我怀疑这会减少意大利面。它还鼓励每人一对一的警告。为此,问题是,我在哪里可以找到符合此策略的示例项目?
答案 0 :(得分:4)
我没有一组示例项目,但我会向您提供有关工作原理以及何时应在XIB文件或代码中创建控制器的一些信息。
如果您的控制器是通过用户的操作动态创建的,则通常不会在XIB文件中实例化它们。相反,你将在代码中实例化它们,如上面提到的危害。一旦你这样做,你仍然需要一种机制来将在代码中创建的控制器连接到你在IB中创建的用户界面元素。
IB提供解决此问题的机制是文件所有者。掌握文件所有者对于“获取”Interface Builder至关重要。
文件的所有者不是“在”XIB文件中的对象,它是在XIB文件中表示的对象。它是加载XIB文件时已存在的对象的占位符。在运行时加载NIB文件时,它们会加载NSBundle方法 - [NSBundle loadNibNamed:ownwer:options:]。 owner参数用于解析XIB / NIB文件中文件的所有者占位符对象。在运行时加载文件时,针对文件所有者的所有连接将针对您作为所有者参数传递给NSBundle方法的对象进行解析。在iPhone上,您通常不会自己加载NIB文件。而是UIViewController为你做的。 UIViewController的loadView方法的默认实现可能如下所示:
- (void)loadView {
[[self nibBundle] loadNibNamed:[self nibName] owner:self options:nil];
}
因此,通过将XIB文件中的元素连接到文件的所有者,您将把它们连接到视图控制器。
你的应用程序中会有一些静态的控制器 - 它们将永远存在。导航或制表符控制器及其根项通常在其应用程序的整个生命周期中都处于活动状态。在这种情况下,我会在MainWindow.xib文件中设置这些视图控制器。大多数其他控制器将动态创建,并以编程方式响应用户的操作。
答案 1 :(得分:1)
好问题。我试图坚持的模式是在代码中创建控制器,为XIB / NIB中与该代码交互的东西添加IBOutlets和IBActions,以及在控制器的构造函数中用“self”加载XIB / NIB的东西。所有者,在IB中我将东西连接到“文件所有者”占位符,我将指定其身份是我的控制器类。