Получение ссылки на представление вида контейнера

Я новичок в разработке приложений для 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"])
         {

          }


  }

посетите приведенную ниже ссылку для получения дополнительной справки

Здесь