Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用NIB文件用委托实例化UIView子类_Iphone_Cocoa_Ipad_Uiview_Nib - Fatal编程技术网

Iphone 使用NIB文件用委托实例化UIView子类

Iphone 使用NIB文件用委托实例化UIView子类,iphone,cocoa,ipad,uiview,nib,Iphone,Cocoa,Ipad,Uiview,Nib,我有一个UIView子类,我想从NIB文件中实例化它。我一直在使用这种方法: UINib *nib = [UINib nibWithNibName:@"SSNodeToolsView" bundle:[NSBundle mainBundle]]; self = [[[nib instantiateWithOwner:self options:nil] objectAtIndex:0] retain]; …事实上,这会正确创建对象并将所有内容连接起来。但是,对象会立即失去对其委托的访问权限。委托

我有一个UIView子类,我想从NIB文件中实例化它。我一直在使用这种方法:

UINib *nib = [UINib nibWithNibName:@"SSNodeToolsView" bundle:[NSBundle mainBundle]];
self = [[[nib instantiateWithOwner:self options:nil] objectAtIndex:0] retain];
…事实上,这会正确创建对象并将所有内容连接起来。但是,对象会立即失去对其委托的访问权限。委托以通常的方式声明:

id delegate
@property (nonatomic, assign) id delegate
@synthesize delegate
……等等。但是,当对象从其nib加载时,委托立即变为null,并忽略为其赋值的任何尝试。奇怪的是,这并没有导致撞车。谁能告诉我这是为什么?我更喜欢使用nib加载方法,因为我的应用程序的这些元素可能会被频繁地重新设计,使用nib进行重新设计是最容易的


-Ash

编辑:将关键点向上移动到顶部。不能在同一个nib中同时创建对象并将其设置为文件的所有者。文件的所有者需要是一个已经存在且已初始化的对象,具有nil outlet ivars,以便nib加载正确地连接到所有者的outlet

委托对象是否也在nib中?如果没有任何内容保留它(您的属性为“assign”),它可能会在下一个自动释放池排水口处消失。学员是否是nib中的一个出口?加载nib后,插座中的“nil”值通常表示插座未正确连接。此外,您似乎正在使用尚未初始化的所有者对象(self)实例化nib?如果是这样,则可能无法正确连接插座,因为只有当所有者对象中的相应值为nil时,才会连接插座。在加载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];
}
使用NIB有一个您无法避免的内置间接级别。您不能创建一个对象,同时将其用作文件的所有者——所有者必须已经存在,并且在nib加载时已初始化(无出口)


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

Aha,谢谢!这就是为什么。我将改为一种更可靠的方法,简单地将自定义视图转换为视图控制器,并直接从其按钮发送iAction。那就是我仍然可以用尼伯斯,这很有效,但你不必。我在自定义UIView子类中使用上述代码,这些子类不是视图控制器的从属类。这是一条相当细的线——viewcontroller方法肯定有一些好处,但它感觉更“沉重”。而且有些好处(viewWill/Did/Aspect/Disapper)除非您自己手动将这些调用转发到子viewcontroller,否则您无法获得。+1回答很好!!尤其是顶部的“关键点”内容。你一想就知道了,但和其他很多人一样,我确信,直到看到你的答案我才想到。谢谢你为我节省时间!!谢谢是的,一开始nib文件中固有的间接寻址级别是非常棘手的。如果如最初的问题所述,上面的代码用于UIView子类,那么它将无法工作。行
[self addSubview:self.view]没有self.view属性开始工作。