Подтвердить что ты не робот

Xcode раскадровка Container View - как мне получить доступ к viewcontroller

Я пытаюсь использовать раскадровку и правильно работать. Я добавил контейнер Container View для одного из моих существующих видов. Когда я пытаюсь добавить ссылку на это в моем контроллере .h file (ctrl-drag), я получаю IBOutlet UIView *containerView. Как мне получить ссылку на контроллер представления вида контейнера? Мне нужен контроллер представления контейнера, поэтому я могу настроить его на мой контроллер, чтобы они могли "разговаривать" друг с другом.

У меня есть настройка моей истории:

enter image description here

И ссылается на мой файл .h как:

enter image description here

Обратите внимание на .h, что есть UIView, а не мой InstallViewController для представления. Как добавить ссылку на контроллер вида? Мне нужно установить делегат.

4b9b3361

Ответ 1

Существует другое решение, указав идентификатор для встраивания segue (s) и извлеките соответствующие контроллеры представления в методе prepareForSegue:

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

Обновление 2013-01-17 - Пример

- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    // -- Master View Controller
    if ([segue.identifier isEqualToString:c_SegueIdEmbedMasterVC])
    {
        self.masterViewController = segue.destinationViewController;
        // ...
    }
    // -- Detail View Controller
    else if ([segue.identifier isEqualToString:c_SegueIdEmbedDetailVC])
    {
        self.detailViewController = segue.destinationViewController;
        // ...
    }
}

c_SegueIdEmbedMasterVC и c_SegueIdEmbedDetailVC являются константами с соответствующим идентификатором идентификаторов сегментов, определенных в раскадровке.

Ответ 2

Когда вы добавляете представление контейнера, xcode вызывает метод UIViewController addChildViewController:

В вашем случае вы можете получить контейнер ViewController, который ищет его в списке SplashViewController childViewControllers, примерно так:

for (UIViewController *childViewController in [self childViewControllers])
{
    if ([childViewController isKindOfClass:[InstallViewController class]])
    {
        //found container view controller
        InstallViewController *installViewController = (InstallViewController *)childViewController;

        //do something with your container view viewcontroller

        break;
    }
}

У меня было такое же сомнение вчера:)

Ответ 3

Ответ Vitor Franchi является правильным, но может быть более эффективным и удобным. Особенно при доступе к контроллеру просмотра детства несколько раз.

Создать свойство readonly

@interface MyViewController ()
@property (nonatomic, weak, readonly) InstallViewController *cachedInstallViewController;
@end

Затем создайте удобный метод getter

- (InstallViewController *)installViewController
{
    if (_cachedInstallViewController) return _cachedInstallViewController;

    __block InstallViewController *blockInstallViewController = nil;
    NSArray *childViewControllers = self.childViewControllers;
    [childViewControllers enumerateObjectsUsingBlock:^(id childViewController, NSUInteger idx, BOOL *stop) {

        if ([childViewController isMemberOfClass:InstallViewController.class])
        {
            blockInstallViewController = childViewController;
            *stop = YES;
        }
    }];

    _cachedInstallViewController = blockInstallViewController;

    return _cachedInstallViewController;
}

Теперь доступ к контроллеру дочернего представления таким образом

[self.installViewController doSomething];

Ответ 4

UIView* viewInsideOfContainer = installerView.subviews[0];

Вы получите UIView внутри UIViewController, который ссылается на ваш UIView. Вы можете использовать subview для любого типа, который наследуется от UIView.

Ответ 5

Если загружается nib, он будет вызывать addChildViewController как часть процесса инициализации

поэтому решение для выполнения может быть также перезаписано

- (void)addChildViewController:(UIViewController *)childController

там вы можете поймать ваш childController, например. сравнивая свой класс и присваивая его свойству /ivar

-(void)addChildViewController:(UIViewController *)childController
{
    [super addChildViewController:childController];

    if([childController isKindOfClass:[InstallViewController class]])
    {
        self.installViewController = (InstallViewController *)childController;
    }

}

Это избавит вас от итерации через childViewControllers.