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 для представления. Как добавить ссылку на контроллер вида? Мне нужно установить делегат.
Ответы
Ответ 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.