首页 > 代码库 > iOS 8 & Xcode 6:UINib加载xib文件问题
iOS 8 & Xcode 6:UINib加载xib文件问题
使用UINib类静态方法nibWithNibName:bundle:加载xib(nib)文件,第一个参数无须加文件后缀。若加后缀,则程序报错;第二个参数为空时,程序从mainBundle指向的路径中搜索文件。
正确的写法:
UINib *storyCellNib = [UINib nibWithNibName:@"StoryCell" bundle:nil];
[self.tableView registerNib:storyCellNib forCellReuseIdentifier:STORY_CELL];
错误的写法:
UINib *storyCellNib = [UINib nibWithNibName:@"StoryCell.xib" bundle:nil]; // 改成StoryCell.nib报相同的错误
[self.tableView registerNib:storyCellNib forCellReuseIdentifier:STORY_CELL];
报错信息:
*** Terminating app due to uncaught exception ‘NSInternalInconsistencyException‘, reason: ‘Could not load NIB in bundle: ‘NSBundle </Users/michael/Library/Developer/CoreSimulator/Devices/7400CB88-E5F3-4FB5-8A84-FBF2B7AC3134/data/Containers/Bundle/Application/2193EB85-C6B4-4A12-8753-02AEC798B15F/zhihudaily.app> (loaded)‘ with name ‘StoryCell.nib‘‘
在Xcode 6中,如果xib文件只定义了一个视图,则不指定File‘s Owner,也指定Custom Class的Class,只指定了Indentifer,使用上面的加载方式也可正常工作。不过,此视图无法添加新的输出接口(IBOutlet)和动作响应(IBAction)。而且,当xib文件中存在多个不同视图时,上述加载方式将报如下错误:
*** Assertion failure in -[UITableView _dequeueReusableViewOfType:withIdentifier:], /SourceCache/UIKit_Sim/UIKit-3318.16.14/UITableView.m:6090
2014-11-24 23:21:18.322 zhihudaily[13323:1498086] *** Terminating app due to uncaught exception ‘NSInternalInconsistencyException‘, reason: ‘invalid nib registered for identifier (StoryCell) - nib must contain exactly one top level object which must be a UITableViewCell instance‘
所以,最好为自定义视图指定Custom Class或File‘w Owner。
结论:当使用nibWithNibName:bundle:方法加载xib文件时,此文件只允许定义一个顶级的视图,若定义多个顶级视图,则产生异常。
iOS 8 & Xcode 6:UINib加载xib文件问题