Как передать данные из моего ViewController в представление контейнера?
У меня есть раскадровка, созданная в XCode и имеющая MainViewController. В MainViewController я добавил ContainerView, который, естественно, создает Segue с другим VIewController.
В моем файле MainViewController.m я настроил данные и хочу связать эти данные с меткой в ContainerView, но я думал, что могу нажать на File Owner и сделать это, но, конечно, не могу, потому что они 2 теперь доступны различные диспетчеры просмотра.
Может кто-то, пожалуйста, помогите мне, потому что я борюсь с этим. Должен быть простой способ, но я не могу взломать его!
Спасибо
Ответы
Ответ 1
Вы можете использовать prepareForSegue так же, как и любые другие два контроллера - этот метод будет вызываться после создания двух контроллеров, но до запуска либо viewDidLoad. Другой способ сделать это - использовать свойство childViewControllers родительского контроллера (встроенный контроллер является дочерним). Итак, ребенок будет self.childViewControllers [0].
После редактирования:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"EmbedSegue"]) {
MyEmbeddedController *embed = segue.destinationViewController;
embed.labelString = self.stringToPass;
}
}
Конечно, вы должны изменить имена на то, что у вас есть. Убедитесь, что имя, которое вы указываете в сегменте в IB, совпадает с именем, которое вы проверяете в инструкции if. В этом примере labelString - это свойство строки, которое вы создали во встроенном контроллере. Затем в этом методе viewDidLoad контроллера вы можете установить значение метки с этой строкой.
Ответ 2
Это почти тот же ответ, что и one by rdelmar только в Swift.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let embeddedVC = segue.destinationViewController as? MyEmbeddedController where segue.identifier == "EmbedSegue" {
embeddedVC.labelString = self.stringToPass
}
}
"EmbedSegue"
имеет идентификатор segue, который вы установили в Interface Builder.
Ответ 3
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Make sure your segue name in storyboard is the same as this line
if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
{
// Get reference to the destination view controller
YourViewController *vc = [segue destinationViewController];
// Pass any objects to the view controller here, like...
[vc setMyObjectHere:object];
}
}
Я также должен отметить, что, поскольку вы используете представление контейнера, prepareForSegue
будет запущен, когда вы представите ViewController
, который содержит контейнер.
Ответ 4
Ответа на этот вопрос для Swift 4:
if let controller = segue.destinationController as? MyEmbeddedController, segue.identifier!.rawValue == "EmbedSegue" {
controller.labelString = self.stringToPass
}