Как получить UIViewController из UIView с помощью кода [дубликат]


На этот вопрос уже есть ответ здесь:

Есть способ получить ссылку на контроллер вида из объекта UIView? Мне нужно что-то вроде этого:

MyParentViewController *myParentViewController = [self.view.superview controller];
5 8

5 ответов:

Для этого можно использовать метод -nextResponder. Согласно http://developer.apple.com/library/ios/documentation/uikit/reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/nextResponder, "UIView реализует этот метод, возвращая объект UIViewController, который управляет им (если он есть) или его superview (если его нет)"

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

Если вы ищете родителя viewcontroller, каждый UIViewController имеет свойство parentViewController, но если вы хотите получить доступ к нему из UIView, вам нужно сначала добраться до вашего UIViewController.

Вы можете посмотреть пример, как создать ссылку на ваш UIViewController в вашем подклассе UIView и как / где установить это в Руководство по программированию контроллера вида для iPhone , см. раздел Создание представления программно в определение пользовательского класса контроллера вида, Вот пример, для более подробной информации смотрите связанный пример метронома.

 - (void)loadView {

    self.wantsFullScreenLayout = YES;

    MetronomeView *view = [[MetronomeView alloc]
                          initWithFrame:[UIScreen mainScreen].applicationFrame];
    view.metronomeViewController = self;
    self.view = view;
    self.metronomeView = view;

    [view release];
}

В заголовке:

@interface MetronomeView : UIView {
    MetronomeViewController *metronomeViewController;
...

Вы можете использовать

[(MyParentViewController *)[[self.view superview] nextResponder] doSomething];

Не следует сохранять ссылку на контроллер вида, так как она может изменяться динамически. Пересекайте цепь ответчика каждый раз, когда вам это нужно.

Вы можете использовать следующее:

    UIViewController* yourViewController = 
                      (UIViewController*)[(YourAppDelegate*)
                      [[UIApplication sharedApplication] delegate] viewController];