为自定义类设置委托对象

时间:2014-08-27 18:44:39

标签: ios objective-c storyboard

我制作了一个自定义视图 我设置了两种启动方法,
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值。

我如何设置代理?

2 个答案:

答案 0 :(得分:1)

如果您要从xib或故事板中实例化这些对象(看起来您基于IBOutlet,则应在-(void)awakeFromNib

中设置您的委托

此时所有插座都已设定。

您不应该依赖于实例化对象的顺序。您应该让它们全部实例化,设置插座,然后对您的代理做任何您需要做的事情

答案 1 :(得分:0)

您的问题不是设置委托,而是您的对象需要委托才能构建。代表应该是一个可选的属性。

你的UIView需要其委托的任何操作都可能被推出实际的构造函数。如果要在nib加载过程中自动设置委托,可以在视图中将其声明为IBOutlet属性。它仍然会在初始化后设置。

如果没有详细说明为什么需要给代理人打电话,就不可能说出你可以将这种逻辑推迟到哪里。