2012-01-09 1 views
2

Мне нужно получить доступ к parentViewController после presentMoalViewController. Это мой метод, который я называю в firstViewController для просмотра secondViewController:Как получить доступ к parentViewController после presentModalViewController?

- (void)viewData { 

    SecondViewController *viewCtrl = [self.storyboard instantiateViewControllerWithIdentifier:@"select_data"]; 
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewCtrl]; 
    navigationController.navigationBar.barStyle = UIBarStyleBlack; 

    UIBarButtonItem *saveButton = [[[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:viewCtrl action:@selector(saveData)] autorelease]; 
    viewCtrl.navigationItem.rightBarButtonItem = salvaButton; 

    UIBarButtonItem *undoButton = [[[UIBarButtonItem alloc] initWithTitle:@"Undo" style:UIBarButtonItemStyleBordered target:viewCtrl action:@selector(backView)] autorelease]; 
    viewCtrl.navigationItem.leftBarButtonItem = annullaButton; 

    [self presentModalViewController:navigationController animated:YES]; 

} 

Когда я нажимаю на SaveButton, я пытаюсь получить доступ к parentViewController таким образом, но это не работает:

- (void) saveData { 

    FirstViewController *parentView = (FirstViewController*)[[self navigationController] presentingViewController]; 
    parentView.dataString = [[NSMutableString alloc] initWithFormat:@"new string"]; 
    [parentView performSelectorInBackground:@selector(myMethod) withObject:nil]; 

    [self dismissModalViewControllerAnimated:YES]; 

} 
+0

Я не получил, когда myMethod называет то, что вам нужно делать? –

+0

Я должен перезагрузить мой tableView – Dany

ответ

0

для navigationController вы можете объявить свойство называется что-то вроде myController, то вы должны начать ваши navigationController так:

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewCtrl]; 
navigationController.navigationBar.barStyle = UIBarStyleBlack; 
navigationController.myController = self; 

UIBarButtonItem *saveButton = [[[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:viewCtrl action:@selector(saveData)] autorelease]; 
viewCtrl.navigationItem.rightBarButtonItem = salvaButton; 

UIBarButtonItem *undoButton = [[[UIBarButtonItem alloc] initWithTitle:@"Undo" style:UIBarButtonItemStyleBordered target:viewCtrl action:@selector(backView)] autorelease]; 
viewCtrl.navigationItem.leftBarButtonItem = annullaButton; 

[self presentModalViewController:navigationController animated:YES]; 

В вашем parentViewController классе вы объявите ваш метод

- (void) saveData { 

FirstViewController *parentView = (FirstViewController*)[[self navigationController] presentingViewController]; 
parentView.dataString = [[NSMutableString alloc] initWithFormat:@"new string"]; 
[parentView performSelectorInBackground:@selector(myMethod) withObject:nil]; 

[self dismissModalViewControllerAnimated:YES]; 
} 

В вашей navigationController, то вы можете позвонить [myController saveData]; Это должно работать, если у вас есть какие-либо вопросы, не стесняйтесь спрашивать!

+0

Я не понимаю, как объявить myController – Dany

+0

Проблема в том, что [self navigationController] presentingViewController] возвращает UITabBarViewController – Dany

1

Было бы намного лучше, если бы вы использовали делегат/протокол во втором диспетчере viewController, который первый viewController мог бы установить как. Вы можете найти более подробную информацию здесь Pass data back to the previous controller или просто выполнить поиск. Этот шаблон проектирования используется практически везде в программировании iOS.

Большое преимущество заключается в том, что тогда ваш второй viewController становится независимым от того, кто его представил, и его можно легко использовать повторно. Технический термин будет «развязать».

0

Вы можете получить доступ к контроллеру родительского вида, используя following-

- (void) saveData { 
NSMutableArray *activeControllerArray = [self.navigationController.viewControllers mutableCopy]; 
FirstViewController *parentView; 
for(int i = 0, i <[activeControllerArray count], i++) { 
    if([[activeControllerArray objectAtIndex:i] isKindOfClass:[FirstViewController class]) { 
     parentView= [activeViewController objectAtIndex:i]; 
     break; 
    } 
} 

parentView.dataString = [[NSMutableString alloc] initWithFormat:@"new string"]; 
[parentView performSelectorInBackground:@selector(myMethod) withObject:nil]; 

[self dismissModalViewControllerAnimated:YES]; 

} 
+0

Спасибо за ваш ответ, но activeControllerArray содержит только secondViewController :( – Dany

1

Последний раз, когда я это сделал, я использовал уведомление:

[[NSNotificationCenter defaultCenter] postNotificationName:@"saveData" object:dataString]; 

в вашем родительском виде didload: VC

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveDataNow:) name:@"saveData" object:nil];