在awakeFromNib中调用DataSource方法

时间:2015-04-26 11:38:52

标签: ios objective-c datasource awakefromnib

所以问题是这样的:

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

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

布局完美,没有任何问题。

问题在于DataSource。我在 awakeFromNib

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

从来没有被召唤过。尝试并尝试后发现,sliderMenu.datasource = self; awakeFromNib 之后运行。这就是为什么MainController中的数据源方法永远不会被调用的原因。

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

1 个答案:

答案 0 :(得分:0)

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

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

OR

制作一个公共方法,比如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];