【问题标题】:How to use generic (NSObject) controller with subviews of a UIViewController?如何将通用(NSObject)控制器与 UIViewController 的子视图一起使用?
【发布时间】:2010-03-08 06:07:03
【问题描述】:

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

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

我(某种程度上)理解 Apple 说每个内容屏幕使用一个视图控制器的原因,使用通用控制器对象 (NSObjects) 来管理屏幕的子部分。

所以我需要一个视图控制器、一个通用控制器、一个视图类和一个 nib。我如何将这些放在一起?

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

  • 我会将视图类与 “班级身份”下降中的笔尖 在 IB 下。
  • 视图控制器将协调 整体屏幕交互。什么时候 必要时,它会创建一个实例 通用控制器。
  • 通用控制器是否加载 笔尖?怎么样?
  • 我是否定义了出口和行动 在那个视图类中,或者他们应该是 在通用控制器中?
  • 如何在 视图控制器和泛型 控制器?

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

【问题讨论】:

  • 这里是苹果文档: 注意:如果你想将一个屏幕分成多个区域并分别管理每个区域,使用通用控制器对象(从 NSObject 降级的自定义对象)而不是视图控制器对象管理屏幕的每个子部分。然后使用单个视图控制器对象来管理通用控制器对象。视图控制器协调整个屏幕交互,但根据需要将消息转发到它管理的通用控制器对象。

标签: iphone cocoa-touch uiviewcontroller subview


【解决方案1】:

好吧,我想我想通了:

  1. 扩展 NSObject 以制作您的 CustomController
  2. 在 CustomController.h 中定义您的 outlet 和 action,包括对 nib 中 UIView 的引用
  3. 将 nib 的文件所有者设置为 CustomController
  4. 像往常一样连接您的所有插座和操作,包括 UIView 插座
  5. 在您的 CustomController.m init 中,加载 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 的控制器将非常像视图控制器。

【讨论】:

  • 不幸的是,这个解决方案没有将 CustomController 添加到响应者链中。
  • 根据 Apple 的帮助文件,我认为您不应该这样做。相反,他们规定包含所有通用控制器的 ViewController 处理响应。我目前也在自己解决这个问题,所以如果我错了,我想听听:)
【解决方案2】:

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

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

查看我在这个问题中的回答,了解它的结构:

UIView and initWithFrame and a NIB file. How can i get the NIB file loaded?

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

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

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多