UIViewController有很多xib

时间:2012-09-14 10:24:42

标签: objective-c ios

我正在开发一个iOS应用程序。我有一个控制器:iPhonePopUpController,在这个控制器中我有一个像这个图像的xib:enter image description here

我的问题是,我可以在此控制器中添加其他xib并在需要时加载它或者我应该创建第二个控制器来加载我的第二个xib吗? enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用以下方式从XIB加载任何内容:

[[NSBundle mainBundle] loadNibNamed:@"YourOtherXIB.xib" owner:someObjectThatWillTakeThePlaceOfFilesOwner options:0]

此行通过创建XIB中对象的实例,取消归档名为YourOtherXIB.xib的XIB,然后连接您在XIB中定义的所有出口和操作,并返回顶级对象列表


当您创建文件所有者为UIViewController的XIB时,您通常会使用以下代码初始化UIViewController

UIViewController* vc = [[[UIViewController alloc] initWithNibName:nibName bundle:bundle] autorelease];

此代码在内部基本上做的是它存储您在某些内部属性中提供的nibNamebundle,以及何时需要加载其视图(特别是第一次需要显示它时)在屏幕上),它使用类似上面引用的行的方式从XIB加载视图:

[bundle loadNibNamed:nibName owner:self options:0];

当您将XIB中的视图连接到view的{​​{1}} IBOutlet时(在这种情况下,File's Owner作为参数传递,即{{1然后,self的{​​{1}}属性将填充刚刚从XIB取消归档的视图。这就是UIViewController从XIB文件加载其视图的方式。

但是,您当然可以为自己的课程执行相同的操作,并且不需要将文件所有者设为view。只需使您的文件所有者成为适合您需要的任何类,从该类公开自定义IBOutlet并将其连接到XIB中的对象。

  • 例如,您可以拥有一个声明UIViewController的{​​{1}}类。将您的XIB中的UIViewController的类定义为类UIViewController,然后将MyCustomClass出口绑定到视图以从XIB加载。然后在代码中创建IBOutlet UIView* myOtherView;的实例,并通过将此File's Owner实例作为MyCustomClass参数
  • 传递,使用上述myOtherView方法
  • 或者,您可以重复使用加载了主XIB的MyCustomClass来加载辅助XIB中的其他视图:只需在loadNibNamed:owner:options:子类中添加MyCustomClass即可。在您的第一个XIB中,您将owner IBOutlet连接到主视图,但保持UIViewController IBOutlet不连接。在第二个XIB中,您将IBOutlet UIView* otherView IBOutlet连接到其他视图,但保持UIViewController IBOutlet不连接。使用第一个XIB加载view时,otherView属性将设置为从XIB加载的视图。然后,如果您希望稍后从其他XIB延迟加载otherView,只需使用view作为笔尖名称UIViewController并以view作为所有者。 otherView将被取消存档,loadNibNamed:owner:options属性将被加载的视图填充。