На раскадровках, представлениях и передаче данных вдоль

В моем раскадровке Xcode 4.2 у меня есть 2 UIViewControllers, This one time и In band camp

  • В This one time у меня есть UIButton с "глупым именем" на нем
  • В In band camp у меня есть UILabel с надписью

Учитывая, что мы имеем дело с двумя отдельными классами И, мы находимся в Xcode 4.2, используя storyboards (где переход между представлениями настраивается через segue), как я могу передать "глупое имя", от контроллера просмотра This one time до метки в представлении контроллера In band camp? "

enter image description here

Ответ 1

  • Установите идентификатор segue в раскадровке на "AwesomeSegue"
  • Внедрить метод prepareForSegue
  • Внутри метода проверьте, соответствует ли идентификатор segue "AwesomeSegue" - если да, используйте destinationViewControllerObject

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if ([segue.identifier isEqualToString:@"AwesomeSegue"]) {
            InBandCampViewController *ibcVC = [segue destinationViewController];
            ibcVC.yourData = self.someStuff;
        }
    }
    

Ответ 2

Мне пришлось придумать одну настройку для моего кода, а также одну альтернативу при использовании этого решения.

В моем случае у меня был переключатель Navigation Controller, который прерывался посередине. MainViewController Segue указывал на этот контроллер навигации, затем из него был еще один Segue, указывающий на SecondViewController.

Итак, если вам когда-нибудь понадобится получить ViewController из навигационного контроллера, вы можете использовать такой код:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // ScoreViewController Storyboard Segue
    if ([segue.identifier isEqualToString:@"AwesomeSegue"]) {

        // Finding ViewController that is needed in Navigation Controller
        UINavigationController *navigationController = segue.destinationViewController;
        ScoreViewController *scoreViewController = [[navigationController viewControllers] objectAtIndex:0];

        // Bellow implement your delegate or any data you want to pass
    }
}

Делегат:
scoreViewController.delegate = self;

Передача данных:
scoreViewController.newLabel.text = self.oldLabel.text;

Метод вызова:
[scoreViewController updateLabelText:self.oldLabel.text];

Кстати, передавая данные, вы должны назначить его IBOutlet из Sugue напрямую.
Если вы просто передадите NSString (или что-то еще) и попытаетесь присвоить его текст UILabel в viewDidLoad, это будет Nill.
Это связано с тем, что viewDidLoad реализовано до Segue.
Использование viewDidAppear здесь тоже не помогает, так как он загружает текст после того, как на экран будет представлен SecondViewController. Вы можете увидеть, как текст UILabel изменяется с "Ярлык" на "глупое имя".

Хорошо, если у кого-то есть предложения, я рад услышать, так как я тоже просто новичок.