【问题标题】:Loading UINavigationController subclass from a Nib从 Nib 加载 UINavigationController 子类
【发布时间】:2011-01-03 17:49:39
【问题描述】:

我的情况如下:我的类SettingsViewController是UINavigationController的子类。该类包含其rootViewController 的逻辑。例如,它充当该根视图控制器中两个表视图的委托和数据源。

我以编程方式设置它没有问题。在SettingsViewController 的初始化器中,我可以创建一个额外的UIViewController 作为根视图控制器,在其视图中定位表视图,并将它们的委托和数据源设置为self。

但我想通过 Nib 加载该根视图。问题是,我不知道如何将那个 Nib 与我的SettingsViewController 连接,如何设置委托和数据源。无法从 Nib 中访问 SettingsViewController。 'File Owner' 代表根视图控制器,而不是 SettingsViewController。

如何从我的根视图控制器 Nib 中访问我的 UINavigationController 子类?

提前致谢。

【问题讨论】:

    标签: iphone objective-c cocoa-touch uikit interface-builder


    【解决方案1】:

    您可以在您的 nib 中声明一个视图并将其设置为 SettingsViewController 类(如果它是一个视图)。

    或在 IB 中拖动一个视图控制器并将其设置为类类型 SettingsViewController

    //编辑:所以你想呈现像MFMailComposerViewController 这样的视图。我的应用程序中还有一个MessageViewController,它的作用几乎相同:

    MessageViewController *mView = [[MessageViewController alloc]initWithNibName:@"MessageView" bundle:nil];
    mView.navController = [[UINavigationController alloc] initWithRootViewController:mView];
    [masterView presentModalViewController:mView.navController animated:YES];
    [mView release];
    

    注意navController 是一个UINavigationController,它在 IB 中连接到导航控制器。

    【讨论】:

    • 这是正确的答案,但我怀疑继承 UINavigationController 是正确的问题。
    • 这不起作用。在我的 xib 中拖动视图控制器只会实例化一个新的 SettingsViewController。请注意,我的SettingsViewController 是以编程方式创建的,在我通过 xib 创建它的根视图控制器。
    • 阅读您的评论,您想创建一个 SettingsViewController 并使用导航栏模态显示它,我是对的吗?那么有什么问题,为什么需要子类化呢? MFMailComposerViewController 不是UINavigationController 的子类,它是一个带有普通导航控制器的视图(我认为)。我在我的应用程序中做同样的事情,但请参阅上面的编辑。
    【解决方案2】:

    您将无法访问 nib 中文件所有者以外的对象。从该笔尖加载视图后,您需要以编程方式设置这些属性;您的 rootViewController 可以在其 -viewDidLoad 中设置其表的委托和数据源。

    另外我要问,你为什么要继承 UINavigationController。类引用警告您“此类不用于子类化”。如果这就是您需要此 SettingsViewController 的全部内容,那么您的委托/数据源逻辑可能会有一个更好的地方。

    【讨论】:

    • 我想知道为什么 Apple 建议不要继承 UINavigationController。他们用 MFMailComposeViewController 自己做。
    • 与任何其他容器视图控制器一样,UINavigationController 在显示其他 UIViewController 时使用私有 API。例如 UINavigationController 在它显示的视图控制器上设置 parentViewController 和 navigationController 属性。由于没有公共 API 可供我们执行相同的操作,因此尝试覆盖 UINavigationController 的任何行为的子类将是有问题的。由于 Apple 可以看到 UINavigationController 内部操作的详细信息并选择使用他们自己的私有接口,这对他们来说不是问题。
    • 我没有覆盖 UINavigationController 的任何行为。
    • 我将 UINavigationController 子类化,因为我不希望呈现我的SettingsViewController(模态)的视图控制器负责创建 UINavigationController 和创建根视图控制器。我认为这会更好地包含在 SettingsViewController 本身中。 (再次,就像MFMailComposeViewController)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多