我熟悉为自己的UIView子类创建XIB的大部分过程,但是并不是所有事情对我来说都工作正常-这主要与IBOutlets链接有关。我可以让他们以一种回旋处的方式工作。
我的设置是这样的:
我的初始化方法是我遇到问题的地方。
我尝试使用NSBundle mainBundle的'loadNibNamed'方法并将所有者设置为'self',希望创建 View 的实例,并自动将其导出与类(class)中的导出匹配(我知道如何执行此操作,我对此非常谨慎)。然后我以为我想使“self”等于那个 Nib 的索引0处的 subview ,而不是做
self = [super init];
或类似的东西。
我感觉我在这里做错了事,但是在线示例在init方法中发生了类似的事情,但是他们将那个subview 0分配给view属性并将其添加为子级-但是那不是总计两个MyClass实例?一个基本上未链接到IBOutlet的链接,其中包含通过loadNibNamed实例化的子MyClass?还是充其量,这不是具有额外中间UIView的MyClass实例,该UIView包含我最初想要作为MyClass的直接子代的所有IBOutlet吗?当执行诸如instanceOfMyClass.frame.size.width之类的事情时,这会带来一点烦恼,因为它返回0,而当引入的子UIView返回我正在寻找的实际帧大小时。
我搞错了init方法中的loadNibNamed是我做错了吗?我应该做更多这样的事情吗?
MyClass *instance = [[MyClass alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"MyClass" owner:instance options:nil];
还是这样?
MyClass *instance = [[[NSBundle mainBundle] loadNibNamed:@"MyClass" owner:nil options:nil] objectAtIndex:0];
在此先感谢您的协助。
最佳答案
第二种选择是正确的。您可以执行的最防御性的代码是这样的:
+ (id)loadNibNamed:(NSString *)nibName ofClass:(Class)objClass {
if (nibName && objClass) {
NSArray *objects = [[NSBundle mainBundle] loadNibNamed:nibName
owner:nil
options:nil];
for (id currentObject in objects ){
if ([currentObject isKindOfClass:objClass])
return currentObject;
}
}
return nil;
}
并这样调用:
MyClass *myClassInstance = [Utility loadNibNamed:@"the_nib_name"
ofClass:[MyClass class]];
// In my case, the code is in a Utility class, you should
// put it wherever it fits best
我假设您的MyClass是
UIView
的子类?如果是这种情况,那么您需要确保.xib的UIView
实际上是MyClass类的。选择 View 后,该定义在界面构建器右侧的第三个选项卡上关于ios - iOS loadNibNamed混淆,最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13534502/