2012-06-02 3 views
7

В моем приложении я использую раскадровку и перетекает, и я часто передавать данные в контроллер представления назначения, прежде чем делать 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; 
} 
+0

Является ли destinationViewController UINavigationController? – adambinsz

+0

@adambinsz: это UIViewController, встроенный в UINavigationController. Сегу в IB переходит прямо в UIViewController. – Macondo2Seattle

+0

Вы уверены, что это не будет в навигационном контроллере?Попробуйте использовать [[segue.destinationViewController viewControllers] objectAtIndex: 0] – adambinsz

ответ

5

Я хотел бы сделать это следующим образом -

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"NextSegue"]) 
    { 
     DestinationViewController *dest = [segue destinationViewController]; 

     dest.myData = self.myData; 
    } 
} 

И в DestinationViewController.h, вы должны создать свойство -

#import <UIKit/UIKit.h> 

@interface DestinationViewController : UIViewController 

@property (nonatomic, strong) NSObject *myData; 


@end 

А также убедитесь, что синтезировать MyData недвижимость в DestinationViewController.m -

@interface DestinationViewController() 

@end 

@implementation DestinationViewController 

@synthesize myData = _myData; 

// other methods here 

@end 
+0

Спасибо, но это почти то же самое, что и в коде, который я опубликовал. – Macondo2Seattle

0

У меня была аналогичная проблема, когда ViewController я делал segue для изменения в какой-то нечетной точке, после того, как немного огляделся, кажется, что segue создал новый ViewController.

Чтобы решить проблему передачи данных, я использовал уведомления.

0

Я знаю, что эта ветка устарела и решение должно быть найдено. Но поскольку окончательное решение не опубликовано здесь, я хотел бы перечислить одну из возможных причин (в том числе и в моем случае). У меня была та же проблема, пытаясь установить переменную в контроллере представления места назначения. Основная причина в том, что я забыл создать экземпляр ([[Class alloc] init]) переменной объекта. Мне нужно это в моем случае, потому что я устанавливаю свойства объекта вместо указания на другой объект. Надеюсь, эта помощь.

3

У меня был этот же выпуск. Оказалось, что целевое свойство ViewController, которое я устанавливал в моем файле prepareForSegue: было объявлено слабым, потому что я скопировал и вставил свойство из того, что было создано автоматически с помощью InterfaceBuilder, но мой не был объектом Storyboard. Так что моя собственность была выпущена и обнулена ARC при выходе из prepareForSegue :. Зафиксировав его как слабое свойство, он зафиксировал его.

+0

Вы сейчас на 110% – sunrize920

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

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