【问题标题】:Set delegate object for custom class为自定义类设置委托对象
【发布时间】:2014-08-27 18:44:38
【问题描述】:

我制作了一个自定义视图。
我设置了两种启动方式,
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 在 vi​​ewDidLoad 之前运行,

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

如何设置委托?

【问题讨论】:

  • 你为什么认为,在设置委托之前不应该调用 initWithCoder ?
  • @pawan initWithCoder 运行 [self setUp] 方法,其中包含从委托方法中汇集数据的代码,如果委托尚未设置,则该方法无法运行

标签: ios objective-c storyboard


【解决方案1】:

如果您从 xib 或情节提要中实例化这些对象(看起来您是基于 IBOutlet,您应该在 -(void)awakeFromNib 中设置您的委托

此时所有的出口都已设置完毕。

您不必依赖对象实例化的顺序。您应该让它们全部实例化,设置出口,然后对您的委托做任何您需要做的事情

【讨论】:

  • 不走运,viewcontroller上的awakeFromNib在自定义类的initWithCoder之前运行是对的,但是我无法设置delegate,因为自定义类还没有初始化,无法访问这是财产。
【解决方案2】:

您的问题不是获取委托集,而是您的对象需要委托进行构造。委托应该是一个可选属性。

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

如果不详细了解为什么需要调用委托,就不可能说出可以将该逻辑推迟到何处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多