2009-10-27 2 views
0

Я программист iPhone для новичков и задаюсь вопросом о том, как обращаться к методам родительского контроля. В моей программе, когда программа сначала загружает (applicationDidFinishLaunching) Я следующий код:В разработке iPhone как получить доступ к методу в ParentViewController

[window addSubview:rootViewController.view]; 

[window makeKeyAndVisible]; 

, который в основном называет это

- (void)viewDidLoad { 

    HomeViewController *homeController=[[HomeViewController alloc] initWithNibName:@"HomeView" bundle:nil]; 
    self.homeViewController=homeController; 
    [self.view insertSubview:homeController.view atIndex:0]; 
    [homeController release]; 
    [super viewDidLoad]; 
} 

Теперь у меня есть вызов IBAction на HomeViewController, что я хочу иметь это вызвать метод в корневой View Controller

Я хочу, чтобы вызвать этот метод

- (void)loadNewGame 
{ 
    self.questionViewController = [[QuestionViewController alloc] initWithNibName:@"QuestionView" bundle:nil]; 
//[homeViewController.view removeFromSuperview];  
    [self.view insertSubview:questionViewController.view atIndex:0]; 
} 

Итак, мой вопрос в том, как я могу вызвать метод из контроллера Parent View?

Я попытался

[self.view removeFromSuperview]; 

[self.parentViewController loadNewGame]; 

, но это не похоже на работу. Может кто-то угодить мне в правильном направлении.

Заранее спасибо

Скотт

ответ

0

Во-первых, как правило, вы называете [super viewDidLoad] первым в своем viewDidLoad.

Для вашего rootViewController вам потребуется переменная экземпляра в вашем классе homeController. Тогда вы могли бы иметь метод в HomeController:

- (void) loadNewGame 
{ 
    [self.rootViewController loadNewGame]; 
} 

Это один из многих различных способов сделать это. Вы можете полностью переместить метод на homeController. Или вы можете захотеть, чтобы IB напрямую использовал методы rootViewControllers ...

вот еще discussion of this.

+0

[self viewDidLoad] должен быть [super viewDidLoad] – Liam

+0

Вы правы! Будет редактировать. – mahboudz

0

Прежде всего, ваш код на самом деле не имеет смысла. Почему вы добавляете свой HomeViewController в вызов -viewDidLoad. Если вы хотите загрузить HomeViewController в качестве начального представления, вы должны установить его в Interface Builder вместо RootViewController. Когда вы хотите отобразить новый контроллер представлений, вы должны использовать стек навигационного контроллера и нажимать на него новый контроллер представления с помощью [[self navigationController] pushViewController: newViewController animated: YES].

Предполагая, что вы получили эту сортировку, вы должны создать поле делегата (id) для вашего контроллера дочернего представления, которое вы можете установить при создании экземпляра нового контроллера представления. Так что ваш код может выглядеть примерно так:

HomeViewController *homeController=[[HomeViewController alloc] 
       initWithNibName:@"HomeView" bundle:nil]; 
[homeController setDelegate:self]; 
[[self navigationController] pushViewController:homeController animated:YES]; 
[homeController release]; 

Затем, когда ваше действие увольняют в HomeViewController, вы можете проверить, чтобы увидеть, если делегат установлен, и если да, то вызовите селектор в вопросе, как это:

- (IBAction)action:(id)sender; 
{ 
    if (delegate && [delegate respondsToSelector:@selector(loadNewGame)]) 
     [delegate performSelector:@selector(loadNewGame)]; 
} 

Возможно, вы захотите прочитать Apple's docs on how to use the navigation controller stack. Это может помочь прояснить некоторые вещи.

Смежные вопросы