我正在开发一个 iOS 应用程序。我有一个控制器:iPhonePopUpController,在这个控制器中我有一个像这样的图像的 xib:
我的问题是,我可以向这个控制器添加另一个 xib 并在需要时加载它,还是应该创建第二个控制器来加载我的第二个 xib?
我正在开发一个 iOS 应用程序。我有一个控制器:iPhonePopUpController,在这个控制器中我有一个像这样的图像的 xib:
我的问题是,我可以向这个控制器添加另一个 xib 并在需要时加载它,还是应该创建第二个控制器来加载我的第二个 xib?
您可以使用以下方法从 XIB 加载任何内容:
[[NSBundle mainBundle] loadNibNamed:@"YourOtherXIB.xib" owner:someObjectThatWillTakeThePlaceOfFilesOwner options:0]
此行通过创建您在 XIB 中拥有的对象的实例来取消归档命名YourOtherXIB.xib的 XIB,然后连接您在 XIB 中定义的所有出口和操作,并返回顶级对象列表。
当您创建一个文件所有者为 的 XIB 时UIViewController,通常您会使用如下代码初始化您的UIViewController代码:
UIViewController* vc = [[[UIViewController alloc] initWithNibName:nibName bundle:bundle] autorelease];
这段代码基本上在内部做的是它存储nibName和bundle你提供的一些内部属性,当它需要加载它的视图时(尤其是第一次需要在屏幕上显示它),它使用类似的东西从 XIB 加载视图上面引用的行:
[bundle loadNibNamed:nibName owner:self options:0];
当您将 XIB 中的视图连接到 的viewIBOutlet 时File's Owner(在这种情况下,它是self作为参数传递的,即它UIViewController本身),那么view您的属性UIViewController将填充刚刚从西布。这就是UIViewController从 XIB 文件加载其视图的方式。
但当然,您可以为自己的课程做同样的事情,并且不需要您的文件所有者是UIViewController. 只需让您的文件所有者成为适合您需要的任何类,从该类公开一个自定义 IBOutlet 并将其连接到您的 XIB 中的对象。
MyCustomClass声明IBOutlet UIView* myOtherView;. File's Owner将您在 XIB 中的类定义为class MyCustomClass,然后将myOtherView出口绑定到视图以从您的 XIB 加载。然后在代码中,创建一个实例并通过传递这个实例作为参数来MyCustomClass使用上述方法loadNibNamed:owner:options:MyCustomClassownerUIViewController加载的主 XIB 以从辅助 XIB 加载其他视图:只需IBOutlet UIView* otherView在UIViewController子类中添加一个。在您的第一个 XIB 中,您将viewIBOutlet 连接到您的主视图,但保持otherViewIBOutlet 未连接。在您的第二个 XIB 中,您将otherViewIBOutlet 连接到您的其他视图,但保持viewIBOutlet 未连接。UIViewController使用第一个 XIB加载您时,该view属性将设置为从您的 XIB 加载的视图。然后,如果您想otherView稍后从其他 XIB 延迟加载,只需调用loadNibNamed:owner:optionswithOtherXIB.xib作为 nib 名称和self所有者。将OtherXIB取消存档,并且otherView属性将填充该加载的视图。