【问题标题】:Call DataSource method in awakeFromNib在 awakeFromNib 中调用 DataSource 方法
【发布时间】:2015-04-26 11:38:51
【问题描述】:

所以问题是这样的:

我继承了 2 个类,即 UIView(name: Menu) 和 UIViewController(name: MainController)。在菜单中,我使用 xib 文件来创建它的布局。在 MainController 中,我将 Menu 添加为这样的子视图,并符合 Menu 中的协议。

SliderMenu *sliderMenu = [[[NSBundle mainBundle] loadNibNamed:@"SliderMenu" owner:self options:nil] objectAtIndex:0];
sliderMenu.datasource = self;
sliderMenu.delegate = self;
[self.view addSubview:sliderMenu];

布局完美,没有问题。

问题在于数据源。我在 awakeFromNib

中调用数据源方法
- (void)awakeFromNib {
// Alloc data
self.data = [[NSArray alloc] initWithArray:[self.datasource arrayOfData]];
}

甚至永远不会被调用。经过反复尝试,我发现sliderMenu.datasource = self;awakeFromNib之后运行。这就是为什么 MainController 中的数据源方法永远不会被调用的原因。

问题: 我该如何解决这个问题?

【问题讨论】:

  • 将你的代码从awakeFromNib移动到datasource赋值之后的某个地方
  • 我试过了,不行。

标签: ios objective-c datasource awakefromnib


【解决方案1】:

如果您在-awakeFromNib 方法中设置断点,您将看到该方法按应有的方式执行。 问题是,此方法在数据源分配之前调用,此时您的 self.datasourcenil
我建议您覆盖 datasource 属性的设置器并在那里初始化您的数据,例如

- (void)setDatasource:(id<YourProtocol>)datasource
{
    _datasource = datasource;
    self.data = [[NSArray alloc] initWithArray:[datasource arrayOfData]];
}

创建一个公共方法,例如 prepare 并在那里进行所有初始化,

- (void)prepare
{
    self.data = [[NSArray alloc] initWithArray:[self.datasource arrayOfData]];
}

并在数据源分配后调用此方法:

SliderMenu *sliderMenu = [[[NSBundle mainBundle] loadNibNamed:@"SliderMenu" owner:self options:nil] objectAtIndex:0];
sliderMenu.datasource = self;
sliderMenu.delegate = self;
[sliderMenu prepare];
[self.view addSubview:sliderMenu];

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多