ios – 来自另一个UIViewController的nib中的nib的自定义UIView – IBOutlets是nil

ios – 来自另一个UIViewController的nib中的nib的自定义UIView – IBOutlets是nil,第1张

概述我正在尝试创建一个自定义UIView,它保存对自己的IBOutlets的引用.然后我想将这个自定义UIView放入另一个笔尖. 我在自定义UIView的awakeFromNib方法中做了一些额外的逻辑.不幸的是,当我尝试访问awakeFromNib中的IBOutlets时,它们是零. 这是设置: >我有一个UIView子类,CustomView. >我有一个包含三个子视图的自定义.xib文件 >在 我正在尝试创建一个自定义UIVIEw,它保存对自己的IBOutlets的引用.然后我想将这个自定义UIVIEw放入另一个笔尖.

我在自定义UIVIEw的awakeFromNib方法中做了一些额外的逻辑.不幸的是,当我尝试访问awakeFromNib中的IBOutlets时,它们是零.

这是设置:

>我有一个UIVIEw子类,CustomVIEw.
>我有一个包含三个子视图的自定义.xib文件
>在另一个nib(属于视图控制器)中,我将UIVIEw拖到视图上,然后将自定义类更改为CustomVIEw.
>我尝试将IB中的CustomVIEw笔尖中的视图设置为自定义类CustomVIEw并将IBOutlets连接到视图,但它们仍然是零.
>我尝试将文件所有者设置为CustomVIEw并将IBOutlets连接到文件的所有者,但它们仍然是零.
>我还尝试使用另一个IBOutlet UIVIEw *视图,然后在awakeFromNib中将其作为子视图添加到self中,但也没有做任何事情.

这是代码:

// CustomVIEw.h@interface CustomVIEw : UIVIEw@property (nonatomic,retain) IBOutlet UITextFIEld *textFIEld;@property (nonatomic,retain) IBOutlet UIVIEw *subvIEw1;@property (nonatomic,retain) IBOutlet UIVIEw *subvIEw2;// CustomVIEw.m@implementation CustomVIEw@synthesize textFIEld,subvIEw1,subvIEw2; - (ID)initWithFrame:(CGRect)frame {    self = [super initWithFrame:frame];    if (self) {        [[NSBundle mainBundle] loadNibnamed:@"CustomVIEw" owner:self options:nil];    }    return self;}- (ID)initWithCoder:(NSCoder *)aDecoder {    self = [super initWithCoder:aDecoder];    if (self) {    }    return self;}- (voID)awakeFromNib {    [super awakeFromNib];    [self setup];}- (voID)setup {    // Fails because self.textFIEld is nil    self.textFIEld.text = @"foo";}
解决方法 我最终使用了最新编辑 here中的步骤,并且它们工作得很漂亮.

您使用简单的UIVIEw作为xib中的顶级视图.

然后,将文件所有者设置为自定义子类(CustomVIEw).

最后,添加一行:

[self addSubvIEw:[[[UINib nibWithNibname:@"CustomVIEw" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0]];

在initWithCoder和initWithFrame中的if(self!= nil)块中.

瞧! IBOutlets已经连接好并准备好在通话结束后继续.对解决方案非常满意,但是很难挖掘出来.

希望这有助于其他任何人.

编辑:我更新了一个没有死的链接.由于我从未拼写过完整的代码,因此修改后的内容如下:

- (ID)initWithFrame:(CGRect)frame {    self = [super initWithFrame:frame];    if (self) {        UIVIEw *nib = [[[UINib nibWithNibname:@"CustomVIEw" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0];        [self addSubvIEw:nib];    }    return self;}- (ID)initWithCoder:(NSCoder *)aDecoder {    self = [super initWithCoder:aDecoder];    if (self) {        UIVIEw *nib = [[[UINib nibWithNibname:@"CustomVIEw" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0];        [self addSubvIEw:nib];    }    return self;}- (voID)awakeFromNib {    [super awakeFromNib];    [self setup];}- (voID)setup {    // Doesn't fail because life is awesome    self.textFIEld.text = @"foo";}

这种模式已经变得非常普遍,我实际上在UIVIEw上创建了一个名为UIVIEw Nib的类,它实现了以下方法:

+ (UIVIEw *)vIEwWithNibname:(Nsstring *)nibname owner:(ID)owner {    return [[[UINib nibWithNibname:nibname bundle:nil]            instantiateWithOwner:owner options:nil]            objectAtIndex:0];}

所以上面的代码可以简化为:

[self addSubvIEw:[UIVIEw vIEwWithNibname:@"CustomVIEw" owner:self]];

另请注意,上面的代码可以进行更多重构,因为initWithFrame中的逻辑完全相同:和initWithCoder:.希望有所帮助!

总结

以上是内存溢出为你收集整理的ios – 来自另一个UIViewController的nib中的nib的自定义UIView – IBOutlets是nil全部内容,希望文章能够帮你解决ios – 来自另一个UIViewController的nib中的nib的自定义UIView – IBOutlets是nil所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1102265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存