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