2013-02-14 3 views
2

Предположим, что я перехожу к контроллерам представлений с помощью segues. У меня есть textField на View Controller 1 и метка на втором контроллере представления. Когда я segueing на 2-й контроллер представления можно легко установить метку с помощью следующего кода:Когда подходящее время для использования представленногоViewController?

ViewController # 2

-(void) viewWillAppear: (BOOL) animated 
{ 
self.labelVC2.text = ((VC1 *)self.presentingViewController).textFieldVC1.text; 
} 

Это имеет смысл. В этом случае используется свойство presentingViewController. При попытке выяснить, когда presentedViewController имущество будет использоваться, кажется логичным, что она будет использоваться с первого контроллера представления в методе prepareForSegue так:

ViewController # 1

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([[segue identifier] isEqualToString:@"SegueToNextVC"]) 
    { 
     ((VC2 *)self.presentedViewController).labelVC2.text = self.textFieldVC1.text; 
    } 
} 

Однако это не похоже, работают, и я предполагаю, что это связано с тем, что в prepareForSegue новый экземпляр моего второго контроллера представлений называется моментом до того, как произойдет segue, таким образом потеряв свойство, которое я только что установил. Если я прав в этом, когда будет подходящее время для использования свойства presentationViewController? Очевидно, я бы не использовал это свойство на моем втором контроллере представления, потому что я могу просто получить доступ к классу напрямую.

ответ

0

Посмотрите на class reference на номер UIStoryboardSegue. У этого есть пара свойств, которые, я думаю, были бы очень полезны для вас.

sourceViewController - «... вид контроллера, содержимое которого отображается в начале Segue», т.е. self

destinationViewController - «... вид контроллера, содержимое которого должно отображаться в конце Segue» который является вашим VC2 который вы пытаетесь получить доступ через self.presentedViewController

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([[segue identifier] isEqualToString:@"SegueToNextVC"]) 
    { 
     ((VC2 *)destinationViewController).labelVC2.text = self.textFieldVC1.text; 
    } 
} 

Возвращаясь к вашему вопросу, хотя ... когда, возможно, вы хотите использовать presentedViewController? Ответ есть, когда у вас еще нет ссылки на presentedViewController. Вот пример.

У вас есть куча классов, все из которых имеют один и тот же родитель. SubViewController1, SubViewController2, SubViewController3, которые являются подклассами MyViewController, и у вас может быть или не может быть один представлен прямо сейчас. Поэтому вы хотите проверить, существует ли она и сказать, что она закончит то, что она делает и уйдет. К счастью, есть метод на MyViewController, который позволит вам сделать именно это.

if (self.presentedViewController) { 
    MyViewController *subVC = (MyViewController *)self.presentedViewController; 
    [subVC finishAndGoAway]; 
} 

Это только один пример того, где вы можете использовать его. Есть много других обстоятельств, когда это было бы полезно, но есть также много раз, когда это совершенно бессмысленно, потому что у вас уже есть ссылка на то, что будет представлено, поэтому вам не нужно использовать стандартную версию.

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