我正在开发一个 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 中的视图连接到 的view
IBOutlet 时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:
MyCustomClass
owner
UIViewController
加载的主 XIB 以从辅助 XIB 加载其他视图:只需IBOutlet UIView* otherView
在UIViewController
子类中添加一个。在您的第一个 XIB 中,您将view
IBOutlet 连接到您的主视图,但保持otherView
IBOutlet 未连接。在您的第二个 XIB 中,您将otherView
IBOutlet 连接到您的其他视图,但保持view
IBOutlet 未连接。UIViewController
使用第一个 XIB加载您时,该view
属性将设置为从您的 XIB 加载的视图。然后,如果您想otherView
稍后从其他 XIB 延迟加载,只需调用loadNibNamed:owner:options
withOtherXIB.xib
作为 nib 名称和self
所有者。将OtherXIB
取消存档,并且otherView
属性将填充该加载的视图。