2015-04-26 3 views
0

Таким образом, вопрос, как это:вызова метода DataSource в awakeFromNib

I подкласс 2 класса, который UIView (название: Меню) и UIViewController (имя: MainController). В меню я использовал xib-файл для создания его макета. В MainController я добавил меню в качестве подзаголовка как это и соответствовал протоколу в меню.

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. Вот почему метод data-source в MainController никогда не вызван.

Вопрос: Как я могу решить эту проблему?

+0

Переместить ваш код от 'awakeFromNib' до где-то после назначения' datasource' – Azat

+0

Я пробовал это, нет работа. – tan

ответ

0

Если вы установили точку останова в методе -awakeFromNib, вы увидите, что этот метод выполняется так, как должен. Дело в том, что этот метод называется до назначения источника данных, и на данный момент ваш self.datasource - nil.
Я предлагаю вам переопределить сеттер свойства 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]; 
+0

Спасибо, человек, ты потрясающий. – tan

+0

:)) Добро пожаловать – arturdev

 Смежные вопросы

  • Нет связанных вопросов^_^