gpt4 book ai didi

ios - 来自另一个 UIViewController Nib 内的 Nib 的自定义 UIView - IBOutlets 为零

转载 作者:可可西里 更新时间:2023-11-01 03:04:51 26 4
gpt4 key购买 nike

我正在尝试创建一个自定义 UIView,其中包含对其自身 IBOutlet 的引用。然后我想将这个自定义 UIView 放入另一个 Nib 。

我正在自定义 UIView 的 awakeFromNib 方法中执行一些额外的逻辑。不幸的是,当我尝试访问 awakeFromNib 中的 IBOutlets 时,它们为零。

这是设置:

  1. 我有一个 UIView 子类,CustomView
  2. 我有一个包含三个 subview 的自定义 .xib 文件
  3. 在另一个 nib(属于 View Controller )中,我将一个 UIView 拖到 View 上,然后将自定义类更改为 CustomView。<
  4. 我尝试将 IB 中 CustomView nib 中的 View 设置为自定义类 CustomView 并将 IBOutlets 连接到 View ,但是它们仍然是零。
  5. 我尝试将文件所有者设置为 CustomView 并将 IBOutlets 连接到文件所有者,但它们仍然为零。
  6. 我还尝试使用另一个 IBOutlet UIView *view 然后将其作为 subview 添加到 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 中的顶级 View 。

然后将文件的所有者设置为自定义子类 (CustomView)。

最后,添加一行:

[self addSubview:[[[UINib nibWithNibName:@"CustomView" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0]];

if (self != nil) block 中的 initWithCoderinitWithFrame

瞧! 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 为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20014437/

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