gpt4 book ai didi

iOS loadNibNamed 困惑,什么是最佳实践?

转载 作者:IT王子 更新时间:2023-10-29 08:03:13 30 4
gpt4 key购买 nike

我熟悉为我自己的 UIView 子类创建 XIB 的大部分过程,但并非一切都对我正常工作——这主要与 IBOutlets 链接有关。我可以让他们以一种看似迂回的方式工作。

我的设置是这样的:

  • 我有 MyClass.h 和 MyClass.m。他们有一个 UIView(称为 View )和一个 UILabel(称为 myLabel)的 IBOutlets。我添加了“view”属性,因为一些在线示例似乎表明你需要这个,它实际上解决了我遇到崩溃的问题,因为它找不到 view 属性,我想甚至在 UIView 父类中也没有.
  • 我有一个名为 MyClass.xib 的 XIB 文件,它的文件所有者自定义类是 MyClass,在我的 .h 和 .m 存在后正确预填充了该类。

我的 init 方法是我遇到问题的地方。

我尝试使用 NSBundle mainBundle 的“loadNibNamed”方法并将所有者设置为“self”,希望我会创建一个 View 实例,它会自动使其导出与我类(class)中的导出相匹配(我知道如何做到这一点,而且我很小心)。然后我想我想让'self'等于那个nib中索引0处的 subview ,而不是做

self = [super init];

或类似的东西。

我觉得我在这里做错了,但是在线示例在 init 方法中发生了类似的事情,但是他们将该 subview 0 分配给 View 属性并将其添加为 subview - 但那不是吗一共有两个 MyClass 实例?一个基本上与 IBOutlets 无关,包含通过 loadNibNamed 实例化的子 MyClass?或者充其量,它不是一个带有额外中介 UIView 的 MyClass 实例,其中包含我最初想要作为 MyClass 的直接子级的所有 IBOutlets 吗?当涉及到执行诸如 instanceOfMyClass.frame.size.width 之类的事情时,这会造成轻微的烦恼,因为当引入的子 UIView 返回我正在寻找的实际帧大小时,它返回 0。

我在 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 loadNibNamed 困惑,什么是最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534502/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com