【发布时间】: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(在视图生命周期方法中),或者是否存在改变视图控制器视图的默认类的方法?
标签: iphone ios uiview uiviewcontroller