我制作了一个自定义视图
我设置了两种启动方法,
1. initWithFrame(用于代码初始化)
2. initWithCoder(用于故事板初始化)
在我的自定义课程
中- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// [self setUp] method contain the code to run the delegate.
[self setUp];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// [self setUp] method contain the code to run the delegate.
[self setUp];
self.backgroundColor = [UIColor greenColor];
}
return self;
}
然后,我将一个视图添加到故事板并在身份检查器中更改该类。 我将视图连接到viewcontroller属性。
我设置了委托和数据源
在我的视图控制器中
@interface ViewController () <UIControlViewDataSource, UIControlViewDelegate>
@property (weak, nonatomic) IBOutlet UIControlView *controlView;
@end
- (void)viewDidLoad
{
self.controlView.delegate = self;
self.controlView.dataSource = self;
}
initWithCoder在viewDidLoad之前运行,
由于它,委托将永远不会运行,因为我的自定义类中的initWithCoder在我在视图控制器中的viewDidLoad中设置委托之前正在运行。
委托属性将具有NULL值。
我如何设置代理?
答案 0 :(得分:1)
如果您要从xib或故事板中实例化这些对象(看起来您基于IBOutlet
,则应在-(void)awakeFromNib
此时所有插座都已设定。
您不应该依赖于实例化对象的顺序。您应该让它们全部实例化,设置插座,然后对您的代理做任何您需要做的事情
答案 1 :(得分:0)
您的问题不是设置委托,而是您的对象需要委托才能构建。代表应该是一个可选的属性。
你的UIView需要其委托的任何操作都可能被推出实际的构造函数。如果要在nib加载过程中自动设置委托,可以在视图中将其声明为IBOutlet属性。它仍然会在初始化后设置。
如果没有详细说明为什么需要给代理人打电话,就不可能说出你可以将这种逻辑推迟到哪里。