UIViewController 子类支持NIB加载和非
Posted
技术标签:
【中文标题】UIViewController 子类支持NIB加载和非【英文标题】:UIViewController subclass to support both NIB loading and non 【发布时间】:2011-02-08 21:45:40 【问题描述】:我正在创建一个内部使用的框架,但在制作具有自定义视图的灵活视图控制器时遇到了问题。
目标是实现类似于UITableViewController
:
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 控件