3

我有一个 UIViewController 根据用户交互在不同时间加载多个子视图。我最初在代码中构建了所有这些子视图,没有 nib 文件。现在我正在转向带有自定义 UIView 子类的 nib 文件。

其中一些子视图显示静态数据,我正在使用loadNibNamed:owner:options:将它们加载到视图控制器中。其他包含我需要访问的控件。

我(有点)理解苹果说每个内容屏幕使用一个视图控制器的原因,使用通用控制器对象(NSObjects)来管理屏幕的子部分。

所以我需要一个视图控制器、一个通用控制器、一个视图类和一个 nib。我怎么把这一切放在一起?

我的工作假设和后续问题:

  • 我会将视图类与 IB 中“类标识”下拉列表中的 nib 相关联。
  • 视图控制器将协调整个屏幕交互。必要时,它将创建通用控制器的实例。
  • 通用控制器是否加载笔尖?如何?
  • 我是在那个视图类中定义出口和动作,还是应该在通用控制器中?
  • 如何在视图控制器和通用控制器之间传递消息?

如果有人能以这种方式向我指出一些使用控制器的示例代码,它将大大有助于我理解。我读过的所有书籍或 stackoverflow 帖子都还没有达到目标。

4

2 回答 2

3

好吧,我想我想通了:

  1. 扩展 NSObject 以制作您的 CustomController
  2. 在 CustomController.h 中定义您的 outlet 和 action,包括对 nib 中 UIView 的引用
  3. 将 nib 的文件所有者设置为 CustomController
  4. 像往常一样连接所有的插座和操作,包括 UIView 插座
  5. 在您的 CustomController.m 初始化中,加载 nib

- (id)init {
    self = [super init];
    if (self != nil)
        [self loadNib];

    return self;
}

- (BOOL)loadNib {
    NSArray *topLevelObjs = nil;
    topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];

    if (topLevelObjs == nil) {
        NSLog(@"Error! Could not load nib file.\n");
        return NO;
    }
    return YES;
}

新的基于 NSObject 的控制器将非常像视图控制器一样工作。

于 2010-04-01T00:38:30.050 回答
1

听起来你想要的就是我创造的“可重复使用的 UIView 小部件”——可重复使用的小部件,它可以做某事/呈现一个显示,你可以根据需要在应用程序屏幕中合并多少次——你可以创建它们纯粹在代码中,或者通过将它们的框架放在另一个 xib 文件中来实例化它们(但你不能在 xib 文件中更改小部件的内部参数,这需要一个 IB 插件)。

这是一个我从未见过在任何地方讨论过的组织。我早期对 iOS 编程的部分挫败感是想要这样的东西,但在任何示例中都没有看到任何表达方式。

请参阅我在此问题中的回答以了解其结构:

UIView 和 initWithFrame 以及一个 NIB 文件。我怎样才能加载NIB文件?

我建议将所有直接/低级事件的小部件内部处理放在 uiview 小部件子类中,并实现一个委托协议以与小部件客户端进行更高级别的交互(即,“loginRequested:userName:passWord”而不是手动访问按钮和小部件内部的文本字段)。

小部件的(可选但推荐)xib 文件具有小部件的所有者,小部件中的初始化代码拥有加载 xib 文件的职责。小部件的客户只需实例化小部件并实现对它有意义的小部件委托函数。

于 2012-01-20T14:22:20.823 回答