Как получить доступ к parentViewController после presentModalViewController? - PullRequest
2 голосов
/ 09 января 2012

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

- (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];

}

Ответы [ 4 ]

1 голос
/ 09 января 2012

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

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

в родительском виде vc view didload:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveDataNow:) name:@"saveData" object:nil];
1 голос
/ 09 января 2012

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

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

0 голосов
/ 09 января 2012

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

- (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 голосов
/ 09 января 2012

Для 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]; Это должно работать, если у вас есть какие-либо вопросы, не стесняйтесь спрашивать!

...