В своем приложении я использую раскадровку и переходы, и я часто передаю данные целевому контроллеру представления перед выполнением переход следующим образом:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
[segue.destinationViewController performSelector:@selector(setMyData:)
withObject:myData];
}
}
Он работает везде, кроме одного места. Селектор вызывается, данные устанавливаются, но когда переход завершается и появляется контроллер назначения, у него нет данных, которые я только что установил.После печати идентификатора контроллера представления как в исходном, так и в целевом контроллерах представления я обнаружил, что segue.destinationViewController
в приведенном выше коде является ДРУГИМ экземпляром контроллера представления, чем тот, который отображается. Что здесь происходит?
[ОБНОВЛЕНИЕ 1]
Я изучил жизненный цикл целевого контроллера представления, и он сначала загружается во время выполнения перехода, но ПОСЛЕ того, как я установил для него свойство! Это означает, что когда я вызываю PerformSelector
на нем, объект контроллера представления не инициализируется! Вот почему данные, которые я установил, не сохраняются. Я не понимаю, почему это так и почему этот же подход работает в других частях моего приложения.
[ОБНОВЛЕНИЕ 2]
Выкладываю код setMyData
по запросу. Сначала у меня вообще не было этого метода, потому что locationToOpen
— публичное свойство. Я добавил его только для того, чтобы убедиться, что он вызывается, и чтобы распечатать информацию об отладке.
- (void)setMyData:(MyData *)myData
{
DLog(@"self: %@", (id)self);
_myData = myData;
}