gpt4 book ai didi

iphone - 使用 NIB 文件用委托(delegate)实例化 UIView 子类

转载 作者:行者123 更新时间:2023-12-03 16:08:48 24 4
gpt4 key购买 nike

我有一个 UIView 子类,我想从 NIB 文件实例化它。我一直使用这个方法来做到这一点:

UINib *nib = [UINib nibWithNibName:@"SSNodeToolsView" bundle:[NSBundle mainBundle]];
self = [[[nib instantiateWithOwner:self options:nil] objectAtIndex:0] retain];

...事实上,这正确地创建了对象并将所有内容链接起来。但是,该对象立即失去对其委托(delegate)的访问权限。委托(delegate)以通常的方式声明:

id delegate
@property (nonatomic, assign) id delegate
@synthesize delegate

...等等。然而,当对象从其 Nib 加载时,委托(delegate)立即变为 null 并忽略任何为其赋值的尝试。奇怪的是,这不会导致崩溃。谁能告诉我这是为什么?我更喜欢使用 Nib 加载方法,因为我的应用程序的这些元素可能会经常重新设计,并且使用 Nib 最容易做到这一点。

- Ember

最佳答案

编辑:将关键点移至顶部。您不能同时创建一个对象并将其设置为文件的所有者,所有这些都在同一个 Nib 中。文件的所有者必须是一个已经存在且已初始化的对象,且 socket 变量为零,以便 Nib 加载能够正确连接到所有者的 socket 。

委托(delegate)对象也在 Nib 中吗?如果没有任何东西保留它(您的属性是“分配”),它可能会在下一个自动释放池排出时消失。代表是你 Nib 上的 socket 吗?加载 Nib 后 socket 中的“nil”值通常表明 socket 连接不正确。另外,您似乎正在使用尚未初始化的所有者对象(自身)实例化 Nib ?如果是这样,您的 socket 可能无法正确连接,因为只有当所有者对象中的相应值为零时, socket 才会连接。在将其用作加载 Nib 的所有者之前,您应该拥有一个完全初始化的所有者对象。

这是我在我的一个项目中使用的“从 Nib 加载此对象”初始化代码:

- (id)initWithFrame:(CGRect)frame 
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code.
//
[[NSBundle mainBundle] loadNibNamed:@"ScoreView" owner:self options:nil];
[self addSubview:self.view];
}
return self;
}

- (void) awakeFromNib
{
[super awakeFromNib];

[[NSBundle mainBundle] loadNibNamed:@"ScoreView" owner:self options:nil];
[self addSubview:self.view];
}

使用 nibs 具有无法避免的内置间接级别。您不能创建一个对象并同时将其用作文件的所有者 - 所有者必须已经存在并在 nib 加载时初始化(使用 nil 导出)。

使用上面的代码,我可以从代码创建我的对象,或者将其直接放入其他 nib 文件中——一个可重用的 UIView 组件。

关于iphone - 使用 NIB 文件用委托(delegate)实例化 UIView 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146791/

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