Ios 为自定义类设置委托对象

Ios 为自定义类设置委托对象,ios,objective-c,storyboard,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.

我创建了自定义视图。
我设置了两种启动方法,
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;
}
然后,我向情节提要添加一个视图,并在identity inspector处更改该类。 我将视图连接到viewcontroller属性

我设置了委托和数据源

在我的视图控制器中

@interface ViewController () <UIControlViewDataSource, UIControlViewDelegate>

@property (weak, nonatomic) IBOutlet UIControlView *controlView;

@end

- (void)viewDidLoad
{
    self.controlView.delegate = self;
    self.controlView.dataSource = self;
}
@界面视图控制器()
@属性(弱、非原子)UIControlView*controlView;
@结束
-(无效)viewDidLoad
{
self.controlView.delegate=self;
self.controlView.dataSource=self;
}
initWithCoder在viewDidLoad之前运行

因此,委托将永远不会运行,因为在我的视图控制器的viewDidLoad中设置委托之前,自定义类中的initWithCoder正在运行。
并且委托属性将具有NULL值


如何设置代理?

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

此时,将设置所有插座


您不必依赖于对象实例化的顺序。您应该让它们全部实例化,设置出口,然后对委托执行您需要执行的任何操作蒂蒂

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


如果没有更多关于为什么需要调用委托的详细信息,就无法说明可以将该逻辑推迟到哪里。

不走运,viewcontroller上的awakeFromNib在自定义类的initWithCoder之前运行是正确的,但我无法设置委托,因为自定义类尚未初始化,我无法访问I为什么您认为,在设置委托之前,不应调用initWithCoder?@pawan initWithCoder运行[self-setUp]方法,该方法包含从委托方法收集数据的代码,如果委托尚未设置,则该方法无法运行