gpt4 book ai didi

ios - 查看 Controller : how to correctly initialize values that depend on NIB

转载 作者:行者123 更新时间:2023-11-28 22:04:15 24 4
gpt4 key购买 nike

我想知道初始化依赖于 NIB 中对象的值的最佳方法是什么。例如,假设我有一个获取自定义 cornerRadiusborderColorUIView

我现在做的是

@interface MyViewController ()
@property (nonatomic, weak) IBOutlet UIView *roundyView;
@end

@implementation MyViewController

- (id)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// (!) Can't assign to roundyView, hasn't been loaded from NIB yet
// ...
}
return self;
}

-(void)viewDidLoad {
// Ahh, NIB loaded, roundyView has a value
self.roundyView.layer.cornerRadius = 5.0f;
self.roundyView.layer.borderColor = [UIColor redColor].CGColor;
}

@end

到目前为止,还不错。接下来我添加一个 setter ,这样我就可以从程序的其他地方更改边框颜色。

@property (nonatomic, strong) UIColor *roundBorderColor;

-(void)setRoundBorderColor:(UIColor*)roundBorderColor {
_roundBorderColor = roundBorderColor;
self.roundyView.layer.borderColor = roundBorderColor.CGColor;
}

问题是我通常在实例化类时调用该访问器,但在它被呈现之前。有点像

MyViewController *vc = [[MyViewController alloc] initWithNibName:@"MyViewController" 
bundle:nil];
// Setting the color, NIB hasn't loaded though (!)
vc.roundBorderColor = [UIColor yellowColor];
[self presentViewController:vc animated:YES completion:nil];

这不起作用,因为 setter 在 viewDidLoad 之前运行。所以我通常会这样放置垃圾:

-(void)viewDidLoad {
// ...
if (_roundBorderColor != nil) {
// The setter was already called somewhere,
// call it again now that we have the NIB
[self setRoundBorderColor:_roundBorderColor];
}
}

有没有更简洁的方法来处理这个问题?

最佳答案

转到 Interface Builder 中的身份检查器(Interface Builder View 中左侧的第三个选项),并为您的 View 设置“用户定义的运行时属性”并添加以下内容:
关键路径:layer.cornerRadius 值:数字,5。
不幸的是 - 这似乎不适用于边框颜色,因为 UI 只允许“颜色”但不允许 CGColor。
一个简单的解决方法可以让您的代码远离颜色,即为您的 View Controller 设置一个用户定义的属性,并通过您的 Nib 进行设置。
在你的 View Controller 中:

@property (nonatomic,strong) UIColor* borderColor;

然后在界面生成器中,通过用户定义的运行时属性将颜色设置为您想要的任何颜色。
然后在 viewDidLoad 中设置图层边框的颜色。
涉及一些代码而不仅仅是UI Builder,但至少代码中不需要指定颜色。

或者,如果您只想使用代码设置颜色并且不想等待“viewDidLoad”,您可以执行以下操作:

-(void)setRoundBorderColor:(UIColor*)roundBorderColor {
[self view]; // force view load from nib
self.roundyView.layer.borderColor = roundBorderColor.CGColor;
}

关于ios - 查看 Controller : how to correctly initialize values that depend on NIB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24400813/

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