我在自定义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"; }
解决方法
您使用简单的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:.希望有所帮助!
原文地址:https://www.jb51.cc/iOS/332877.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。