所以问题是这样的:
我将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中的数据源方法永远不会被调用的原因。
问题: 我该如何解决这个问题?
答案 0 :(得分:0)
如果在-awakeFromNib
方法中放置断点,您将看到此方法按预期执行。
问题是,此方法在数据源分配之前调用,此时您的self.datasource
为nil
。
我建议您覆盖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];