UIViewController 子类支持NIB加载和非

Posted

技术标签:

【中文标题】UIViewController 子类支持NIB加载和非【英文标题】:UIViewController subclass to support both NIB loading and non 【发布时间】:2011-02-08 21:45:40 【问题描述】:

我正在创建一个内部使用的框架,但在制作具有自定义视图的灵活视图控制器时遇到了问题。

目标是实现类似于UITableViewController:

如果视图控制器是用 nib 初始化的(或者如果找到了同名的 nib),它会使用其中定义的 outlet 来定义它的视图。确保使用正确的 UIView 子类在一定程度上取决于开发人员。 如果视图控制器在没有 nib 的情况下初始化(或者如果找不到 nib),它会使用正确的 UIView 子类创建自己的视图。

作为第一次尝试,我覆盖了-loadView 来创建自定义视图。如果您不关心笔尖,这就是您会做的事情,而且效果很好。但是,如果我尝试加载一个笔尖(例如,使用-initWithNibNamed:bundle:),-loadView 方法就会执行并且笔尖会被忽略。

我还尝试使用-nibName 来确定是否传递了笔尖名称,这部分有效,但如果通过了nil 则失败(这仍然有效,并且如果有笔尖绝对仍然可以工作与视图控制器同名)。

请记住,我正在构建一个可供其他开发人员使用的框架。 “灵活”和“万无一失”是关键词。

任何帮助都会比我现在拥有的更多。非常感谢。

编辑:已解决

正如下面@bunnyhero 的建议所暗示的,在-loadView 期间检查笔尖的可用性并尝试重新创建它的默认实现,结果证明可以解决问题。我已经解决了这样的问题:

- (void)loadView 
    NSString *nib = self.nibName;
    NSBundle *bundle = self.nibBundle;
    if(!nib) nib = NSStringFromClass([self class]);
    if(!bundle) bundle = [NSBundle mainBundle];

    NSString *path = [bundle pathForResource:nib ofType:@"nib"];

    if(path) 
            [bundle loadNibNamed:nib owner:self options:nil];
            return;
    

    // Create custom view programmatically here.

谢谢@bunnyhero

【问题讨论】:

如果你缩小到一个特定的问题会有所帮助。 对不起,它有点宽泛......让我尝试更简洁:有没有办法知道视图控制器是否正在加载 NIB(在视图生命周期方法中),或者是否存在改变视图控制器视图的默认类的方法? 【参考方案1】:

如果您将 nibName nil 检查与手动检查与视图控制器同名的 nib 结合起来会怎样?

可能是这样的(未经测试的代码在我脑海中浮现):

if ([self nibName] != nil || [[self nibBundle] pathForResource:NSStringFromClass([self class]) ofType:@"xib"] != nil)

    // nib file exists...

我承认这有点粗鲁和间接:)

【讨论】:

这类似于我目前正在走的路径。感谢您验证我的理论。如果我让它按我想要的方式工作,我会报告。一点额外的琐事:编译后,捆绑包中的 nib 具有 .nib 扩展名,而不是预编译的 .xib

以上是关于UIViewController 子类支持NIB加载和非的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将 nib 名称指定为字符串的情况下使用 nib 加载 View Controller 子类?

iOS Swift 子类化 ViewController 由 xib (nib) 文件初始化

为笔尖启动的视图添加边框和阴影

使用 UIViewController 子类自定义 iPhone 控件

如何在不使用 Nib 的情况下实例化和调用 UIView 子类

nib 文件中的 uiviewcontroller