UIViewController子类支持NIB加载和非加载

时间:2011-02-08 21:45:40

标签: iphone ios uiview uiviewcontroller

我正在创建一个内部使用的框架,而且我遇到了一个问题,即使用自定义视图创建一个灵活的视图控制器。

目标是实现类似于UITableViewController的实现:

  • 如果使用nib初始化视图控制器(或者如果找到了同名的笔尖),则使用其中定义的出口来定义视图。开发人员可以确保使用UIView的正确子类。
  • 如果在没有nib的情况下初始化视图控制器(或者如果找不到nib),则使用正确的UIView子类创建它自己的视图。

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

我也尝试使用-nibName来确定是否传递了一个笔尖名称,这个PARTIALLY有效,但是如果nil被传递则失败(这仍然有效,如果有一个与视图控制器同名的笔尖。

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

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

修改:已解决

正如@ bunnyhero在下面提到的建议,在-loadView期间检查nib的可用性并尝试重新创建它的默认实现结果证明了这一点。我已经确定了这样的事情:

- (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

1 个答案:

答案 0 :(得分:3)

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

也许这样的事情(未经测试的代码在我的头顶):

if ([self nibName] != nil || [[self nibBundle] pathForResource:NSStringFromClass([self class]) ofType:@"xib"] != nil)
{
    // nib file exists...
}

我承认这是粗暴和间接的:)