0

我正在开发一个 iOS 应用程序。我有一个控制器:iPhonePopUpController,在这个控制器中我有一个像这样的图像的 xib:在此处输入图像描述

我的问题是,我可以向这个控制器添加另一个 xib 并在需要时加载它,还是应该创建第二个控制器来加载我的第二个 xib?在此处输入图像描述

4

1 回答 1

0

您可以使用以下方法从 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];

这段代码基本上在内部做的是它存储nibNamebundle你提供的一些内部属性,当它需要加载它的视图时(尤其是第一次需要在屏幕上显示它),它使用类似的东西从 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:MyCustomClassowner
  • 或者,您也可以重用您UIViewController加载的主 XIB 以从辅助 XIB 加载其他视图:只需IBOutlet UIView* otherViewUIViewController子类中添加一个。在您的第一个 XIB 中,您将viewIBOutlet 连接到您的主视图,但保持otherViewIBOutlet 未连接。在您的第二个 XIB 中,您将otherViewIBOutlet 连接到您的其他视图,但保持viewIBOutlet 未连接。UIViewController使用第一个 XIB加载您时,该view属性将设置为从您的 XIB 加载的视图。然后,如果您想otherView稍后从其他 XIB 延迟加载,只需调用loadNibNamed:owner:optionswithOtherXIB.xib作为 nib 名称和self所有者。将OtherXIB取消存档,并且otherView属性将填充该加载的视图。
于 2012-09-14T11:45:44.840 回答