2013-06-01 4 views
1

У меня есть подробный вид, который загружается в UIViewScroll. В качестве части загрузки его в представление прокрутки я установил несколько свойств в подробном представлении, например. (UIButton) и отключение (NSString).Доступ к свойствам в viewDidLoad vs viewWillAppear vs viewDidAppear

[controller.button setTitle:text forState:UIControlStateNormal]; 
[controller setTrip:[tripIDs objectForKey:[sortedTrips objectAtIndex:page]]]; 

Теперь в контроллере подробно я стараюсь читать эти свойства в трех различных методах

- (void)viewDidLoad 
- (void)viewWillAppear:(BOOL)animated 
- (void)viewDidAppear:(BOOL)animated 
{ 
     NSLog(@"Button text %@",[[[self button] titleLabel]text]); 
     NSLog(@"Trip text %@",[self trip] text]);  
} 

я только получить значение свойств, когда я прочитал в viewDidAppear, для viewDidLoad и viewWillAppear все, что я получаю пустое ,

Почему? А также где я должен читать и писать эти подробные свойства вида до, они появляются на экране, чтобы пользователь не видел изменения текста после загрузки вида?

Спасибо за вашу помощь!

Добавление заявления на отключение от деталей controller.h

@property (nonatomic, strong) NSString *trip; 
+0

Правильно ли вы подключили розетки? –

+0

Да, IBOutlets подключены к правильному управлению XIB – FireFly

ответ

0

Что касается UIButton проблемы, проблема в том, что вы не можете обратиться к представлениям контроллера управляет до к viewDidLoad. Поэтому, если вы создали контроллер, а затем попытались сразу установить название кнопки, это не будет работать, потому что представление еще не создано. Фактически, если вы посмотрите на значение controller.button, когда вы совершаете вызов метода setTitle, я подозреваю, что вы увидите, что это nil. В нижней строке один контроллер просмотра никогда не должен пытаться получить доступ к элементам управления представлением, принадлежащим другому контроллеру представления.

Что вам нужно сделать, это создать объекты NSString в контроллере получателя, который вы устанавливаете при первом экземпляре контроллера вида. Затем viewDidLoad должен сделать setTitle, установив заголовок на значение, которое вы сохранили в свойстве NSString.

Что касается вашего trip переменного, это трудно понять, что происходит там, в качестве вызова setTrip метода (который наводит на мысль, что trip является NSString не состояли с NSLog заявлением trip собственности. Не обращая внимания на тот факт, что вы есть в NSLog поездки в непригодность ], вы также используете метод text который является то, что вы могли бы сделать, если trip был UILabel, к примеру. Но NSString объекты не имеют метод text .. вы, возможно, потребуется поделитесь своей декларацией собственности trip, чтобы мы могли помочь вам больше на на одном. Но если это тоже IBOutlet, то проблема, вероятно, будет такой же, как и в моем предыдущем обсуждении о button.

Возвращаясь к вопросу о viewDidLoad v viewWillAppear и viewDidAppear, это действительно не имеет значения. Ваши свойства должны быть доступны во всех трех. Как правило, люди обычно используют viewDidLoad, если это не вызвано чем-то другим (например, таймеры или некоторая анимация часто лучше всего делают в viewDidAppear), но вы не сформулировали ничего в своем вопросе, который предположил бы, что viewDidLoad будет не в порядке Это дело.

Но, как я уже сказал, я подозреваю, что ваш код, который создал controller, также пытается получить доступ к некоторым из его объектов IBOutlet, чего вы не можете сделать. Или, потенциально, ваши розетки не подключены должным образом.

+0

Спасибо за подсказку. Изменен код для передачи NSString контроллеру детали из родительского контроллера. Добавлен '@property (неатомный, сильный) NSString * buttonLabel' в контроллер детали. Затем вызовите '[controller setButtonLabel: destinationToText]', чтобы установить его в родительском контроллере. Далее в представлении контроллера деталиDidLoad '[[self button] setTitle: buttonLabel forState: UIControlStateNormal]'. Когда я проверяю buttonLabel, все равно nil в viewDidLoad. Но когда я делаю «[[self button] setTitle: buttonLabel forState: UIControlStateNormal] ', пользовательский интерфейс заполняется с помощью кнопкиLabel. Магия? – FireFly

+0

Поездка объявлена ​​как @property (неатомный, сильный) NSString * trip; – FireFly

+0

@FireFly Что касается вашего комментария о 'buttonLabel', который является' nil', я не знаю, если вы определили как '@ property', так и явно объявляете переменную экземпляра класса. Вы должны _not_ объявлять переменные экземпляра для своих свойств, но пусть компилятор синтезирует их для вас. И либо используйте '@synthesize buttonLabel = _buttonLabel ;', либо вообще не выполняйте оператор' @ synhesize' (в этом случае он делает то же самое, автоматически синтезируя ivar с ведущим подчеркиванием). – Rob

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