Вызвать родительский контроллер представления (через навигационный контроллер) - PullRequest
7 голосов
/ 08 ноября 2011

В настоящее время я добавляю viewcontroller, используя pushViewController:animated:, и теперь из этого нового хотелось бы вызвать метод внутри моего «родительского» -контроллера. Я думаю, что застрял в навигационном контроллере.

В настоящее время пытаюсь проверить, нужен ли мне контроллер:

if([self.superclass isKindOfClass:[MySuperController class]])
// and tried:
if([self.presentingViewController isKindOfClass:[MySuperController class]])

Ни один из этих двух не сработал.

Как я могу получить доступ к контроллеру (метод в нем), который выдвинул текущий?

Ответы [ 3 ]

37 голосов
/ 08 ноября 2011

Так же, как упоминал Марссон, вам нужно использовать делегат ...

Вот пример:

В вашем дочернем контроллере .h файл:

@protocol ChildViewControllerDelegate <NSObject>
- (void)parentMethodThatChildCanCall;
@end

@interface ChildViewController : UIViewController 
{
}
@property (assign) id <ChildViewControllerDelegate> delegate;

В вашем дочернем представлении .m файл контроллера:

@implementation ChildViewController
@synthesize delegate;


// to call parent method:
//  [self.delegate parentMethodThatChildCanCall];

В родительском представлении контроллера .h файл:

@interface parentViewController <ChildViewControllerDelegate>

В родительском представлении контроллера .m файл:

//after create instant of your ChildViewController
childViewController.delegate = self;

- (void) parentMethodThatChildCanCall
{
  //do thing
}
4 голосов
/ 08 ноября 2011
self.navigationController.viewControllers

Возвращает массив всех контроллеров представления в стеке навигации.Текущий контроллер представления находится наверху стека, предыдущий контроллер представления - следующий вниз, и так далее.

Итак, вы можете сделать следующее:

NSArray *viewControllers =     self.navigationController.viewControllers;
int count = [viewControllers count];
id previousController = [viewControllers objectAtIndex:count - 2];
if ([previousController respondsToSelector:@selector(myMethod)])
    [previousController myMethod];

Если вы знаете, к какому классу относится предыдущий контроллер, вы можете использовать его Explicity вместо использования id.

1 голос
/ 08 ноября 2011

Не уверен в логике вашего приложения, но вы всегда можете сделать это.

В вашем "дочернем" контроллере объявите свойство типа parent-controller.Итак, в вашем .h файле:

MySuperController *superController;
property(nonatomic, retain)MysuperController *superController;

и в вашем .m файле:

@synthesize superController;

Перед тем, как «нажать» ваш дочерний контроллер:

MyChildController *child = ...
[child setSuperController:self];
[self.navigationController pushViewController:child animated:YES];

Тогда в вашем дочернем контроллере вы можете просто получить доступ к своему супер с помощью

[this.superController myMethod:param];

Я не собираюсь пропагандировать этот способ кодирования, но это быстрый / дешевый / грязный способ выполнения задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...