Получение ссылки на представление вида контейнера
Я новичок в разработке приложений для iOS. Я подключил контроллер tableview таким образом, что, когда я выбираю одну из строк, я получаю другой UIViewController с использованием didSelectRowAtIndexPath. У меня есть контейнерный просмотр внутри этого UIViewController, который отображает (скажем, пока) индекс строки, на которой был вызван метод didSelectRowAtIndexPath. Я хочу сделать это с помощью segue, но проблема в том, что я не знаю, как получить ссылку на контроллер представления, который формируется с помощью представления контейнера. Я знаю, что вы можете получить диспетчер View View, используя segue.destinationViewController в prepareForSegue, но как мне получить ссылку на контроллер просмотра, который будет загружен из-за представления контейнера. Я создаю приложение для iOS 6. Также я использовал Storyboard для пользовательских интерфейсов. Благодаря
Изменить:
Этот вопрос в основном сводится к тому, как получить ссылку на UIViewController-2, на который указывает UIContainerView, находящийся внутри UIViewController-1. UIViewController-1 запускается путем выбора строки UITableViewController
UITableViewController (выбор строки для вывода) --- > UIViewController-1, который содержит... ContainerView --- > UIViewController-2 (ViewController, связанный с ContainerView).
Ответы
Ответ 1
Хорошо, представьте себе этот сценарий:
![storyboard]()
И пусть предполагается, что вы хотите обновить метку на этом "дочернем контроллере второго представления" с данными модели, поддерживающими ячейку, которую вы использовали в представлении таблицы.
Что вы можете сделать:
-
Дайте segue из первой сцены второму уникальному идентификатору (например, Detail
), определите свойство в этом втором контроллере представления, чтобы получить переданное ему значение (например, someStringValue
), и напишите a prepareForSegue
, который передает значение, например:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Detail"])
{
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
[segue.destinationViewController setSomeStringValue:self.objects[indexPath.row]];
}
}
-
Повторите этот процесс для своего внедрения, а именно, дайте вашему встроенному segue свой собственный уникальный идентификатор (например, Embed
) и создайте свойство в контроллере представления контроллера "child of second view", чтобы получить переданное значение (например, someStringValue
) и иметь prepareForSegue
во втором контроллере представления, который передаст значение вместе с его контроллером дочерних представлений, например:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Embed"])
{
[segue.destinationViewController setSomeStringValue:self.someStringValue];
}
}
Ответ 2
Как утверждают другие, можно переопределить prepareForSegue, чтобы найти контроллер дочернего представления - лично я предпочитаю использовать UIViewController.childControllers, так как вы можете получить доступ к этому времени, отличному от того, когда происходит встроенный segue.
-(void)viewDidLoad {
for (UIViewController* vc in self.childViewControllers) {
if ([vc isKindOfClass:MyChildController.class]) {
// do something here
}
}
}
Не предлагая, чтобы вы это делали, но если вы работаете с раскадными версиями, порядок массива childControllers точно совпадает с порядком в построителе интерфейса, поэтому вы можете напрямую ссылаться на childViewControllers [0], [1]
Ответ 3
Вы правы насчет prepareForSegue
. destinationViewController
предоставит вам контроллер вида назначения.
Я не понимаю, зачем вам нужно что-нибудь еще. Если вы хотите, чтобы контроллер назначения содержал другой контроллер (почему?), Вы можете указать контроллеру назначения a @property
, который указывает на этот контроллер, и вы можете прочитать и установить это свойство.
Но остается вопрос - зачем вам это делать?
Ответ 4
Если все, что вы делаете, это создание моделируемой навигационной панели, тогда использование представления контейнера и контроллера детского представления излишне сложное и интенсивное в памяти. Просто создайте свою смоделированную навигационную панель в виде представления в контроллере 1, дайте ему ярлык, который содержит ваше название, подключите ярлык в качестве розетки и установите метку по желанию. Много, намного чище и проще.
Ответ 5
Объявление идентификатора повторного использования соты и использование этого метода.
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"nameOfSegue"])
{
}
}
посетите приведенную ниже ссылку для получения дополнительной справки
Здесь