在 awakeFromNib 中调用 DataSource 方法
Call DataSource method in awakeFromNib
所以问题是这样的:
我子类 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
方法中放置一个断点,您将看到该方法按预期执行。
问题是,这个方法在数据源分配之前调用,此时你的 self.datasource
是 nil
.
我建议你覆盖 datasource
属性 的 setter 并在那里初始化你的数据,例如
- (void)setDatasource:(id<YourProtocol>)datasource
{
_datasource = datasource;
self.data = [[NSArray alloc] initWithArray:[datasource arrayOfData]];
}
或
创建一个 public 方法,比如 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];
所以问题是这样的:
我子类 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
方法中放置一个断点,您将看到该方法按预期执行。
问题是,这个方法在数据源分配之前调用,此时你的 self.datasource
是 nil
.
我建议你覆盖 datasource
属性 的 setter 并在那里初始化你的数据,例如
- (void)setDatasource:(id<YourProtocol>)datasource
{
_datasource = datasource;
self.data = [[NSArray alloc] initWithArray:[datasource arrayOfData]];
}
或
创建一个 public 方法,比如 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];