2015-04-12 2 views
-2

Зачем нужен следующий код от Passing Data between View Controllers? :Зачем передавать данные между контроллерами View с помощью segue

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

    if([segue.identifier isEqualToString:@"showDetailSegue"]) 
    { 
     ViewControllerB *controller = (ViewControllerB *)segue.destinationViewController; 
     controller.isSomethingEnabled = YES; 
    } 

} 

Все, что я вижу, это то, что он создает экземпляр класса ViewControllerB. Я не понимаю, как этот экземпляр (контроллер) может быть фактическим ViewController, которым он передает эти данные? Какую концепцию мне не хватает?

ответ

2

Код, который вы отправили, не экземпляр нового экземпляра ViewControllerB. К моменту вызова prepareForSegue:sender: контроллер представления уже был создан с помощью раскадровки и назначен для свойства destinationViewController переданного в segue. Таким образом, код, по сути, просто получает ссылку на контроллер вида, который уже создан и будет использоваться в сеансе.

Смотрите раздел Segues Automatically Instantiate the Destination View Controller в Руководства по программированию View Controller для прошивки:

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

перетекает содержат много информации о переходе, в том числе следующее:

  • Объект, который вызвал переход к срабатывать, известный как отправитель
  • Контроллер вид источника, который запускает SEGUE
  • контроллер вид назначения быть обработан
  • вид перехода, который должен быть использован, чтобы довести точку зрения назначения контроллера на экране
  • Необязательные строковый идентификатор, который идентифицирует конкретный переход в раскадровке

Когда переход срабатывают, IOS, выполняет следующие действия:

  1. Это инициализирует контроллер представления назначения, используя значение атрибутов вы представлены в раскадровка.
  2. Он дает контроллеру источника возможность настраивать новый контроллер.
  3. Он выполняет переход, сконфигурированный в режиме segue.
+0

О, я думаю, что получил. При создании этого контроллера я назначу ему адрес памяти segue.destinationViewController, который является ссылкой на фактический ViewController, к которому я передаю данные, поэтому контроллер фактически будет таким ViewController (потому что он указывает на тот же адрес, что и для segue. destinationViewController), правильно? –

+0

При выполнении отступов, созданных в раскадровке (как в случае ~ 99% времени), вы не создаете _or_ назначать контроллер вида вообще - это делается для вас. Вы просто используете 'prepareForSegue: sender:' для конфигурирования («подготовить») этот контроллер просмотра. Чтобы облегчить это, ссылка на контроллер просмотра доступна для вас через переданный 'segue' (его свойство' destinationViewController'). Итак, в этом смысле вы правы - 'segue.destinationViewController' указывает на тот же адрес памяти, на который переводится фактический контроллер представления. – Stuart

+0

ViewControllerB * контроллер = (ViewControllerB *) segue.destinationViewController; контроллер укажет на адрес segue.destinationViewController? Я спрашиваю об этом, потому что я только изменяю controller.isSomethingEnabled, а не segue.destinationViewController.isSomethingEnabled –

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