如何使用用Interface Builder创建的nib文件加载UIView
我试图做一些细致的事情,但应该是可能的。 所以这里对你所有的专家来说都是一个挑战(这个论坛是你们中许多人的一部分:))。
我创建了一个调查问卷“组件”,我想在NavigationContoller
(我的QuestionManagerViewController
)上加载它。 “组件”是一个“空的” UIViewController
,它可以根据需要回答的问题加载不同的视图。
我这样做的方式是:
UIView
子类,定义一些IBOutlets
。 Question1View.xib
(这里是我的问题可能是 )。 我将UIViewController
和UIView
都设置为Question1View类。 我重写了我的QuestionManagerViewController
的initWithNib
,如下所示:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:@"Question1View" bundle:nibBundleOrNil]) {
// Custom initialization
}
return self;
}
当我运行代码时,出现此错误:
2009-05-14 15:05:37.152 iMobiDines [17148:20b] ***由于未捕获的异常' NSInternalInconsistencyException
',原因:' -[UIViewController _loadViewFromNibNamed:bundle:]
加载了“Question1View”笔尖,但视图插座没有设置。“
我确定有一种方法可以使用nib文件加载视图,而无需创建viewController类。
还有一种更简单的方法来访问视图,而不是将nib作为数组处理。
1 )创建一个自定义的View子类,其中包含您希望稍后访问的任何插座。 - 我的看法
2 )在您想要加载和处理笔尖的UIViewController中,创建一个IBOutlet属性,以保存加载的笔尖视图
在MyViewController(一个UIViewController子类)
@property (nonatomic, retain) IBOutlet UIView *myViewFromNib;
(不要忘记综合它并将其释放到.m文件中)
3)在IB中打开你的笔尖(我们称之为'myViewNib.xib'),将你的文件的所有者设置为MyViewController
4)现在将文件的Owner出口myViewFromNib连接到笔尖中的主视图。
5)现在在MyViewController中,写下面一行:
[[NSBundle mainBundle] loadNibNamed:@"myViewNib" owner:self options:nil];
现在只要你这样做,调用你的财产“self.myViewFromNib”将让你访问你的笔尖视图!
谢谢你们。 我确实找到了一种做我想做的事情的方式。
IBOutlet
创建你的UIView
。 UIViewController
(没有自定义子类,但是是“真正的”子类)。 文件所有者的视图连接到主视图,并将其类声明为步骤1)中的一个。 IBOutlet
连接起来。 DynamicViewController
可以运行其逻辑来决定要加载的视图/ xib。 一旦它做出决定,在loadView
方法中就像这样:
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"QPickOneView"
owner:self
options:nil];
QPickOneView* myView = [ nibViews objectAtIndex: 1];
myView.question = question;
而已!
主包的loadNibNamed
方法将负责初始化视图并创建连接。
现在ViewController可以根据内存中的数据显示一个视图或另一个视图,并且“父”屏幕不需要打扰这个逻辑。
我不确定其中一些答案是在说什么,但是我需要在这里回答这个问题,以便我下次在Google中进行搜索。 关键字:“如何从nib加载UIView”或“如何从NSBundle加载UIView”。
从Apress Beginning iPhone 3手册(第247页,“使用新的表格视图单元格”),几乎100%的代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"Blah"
owner:self options:nil];
Blah *blah;
for (id object in bundle) {
if ([object isKindOfClass:[Blah class]]) {
blah = (Blah *)object;
break;
}
}
assert(blah != nil && "blah can't be nil");
[self.view addSubview: blah];
}
这假设你有一个UIView
叫子Blah
,一个叫笔尖Blah
其中包含UIView
有其阶级设置为Blah
。
分类:NSObject + LoadFromNib
#import "NSObject+LoadFromNib.h"
@implementation NSObject (LoadFromNib)
+ (id)loadFromNib:(NSString *)name classToLoad:(Class)classToLoad {
NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:name owner:self options:nil];
for (id object in bundle) {
if ([object isKindOfClass:classToLoad]) {
return object;
}
}
return nil;
}
@end
Swift Extension
extension UIView {
class func loadFromNib<T>(withName nibName: String) -> T? {
let nib = UINib.init(nibName: nibName, bundle: nil)
let nibObjects = nib.instantiate(withOwner: nil, options: nil)
for object in nibObjects {
if let result = object as? T {
return result
}
}
return nil
}
}
并使用一个例子:
class SomeView: UIView {
class func loadFromNib() -> SomeView? {
return self.loadFromNib(withName: "SomeView")
}
}
链接地址: http://www.djcxy.com/p/78229.html
上一篇: How to load a UIView using a nib file created with Interface Builder
下一篇: How do you load custom UITableViewCells from Xib files?