Закройте один модальный ViewController и откройте другой в том же методе.Возможный? - PullRequest
7 голосов
/ 29 марта 2011

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

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

[self.navigationController dismissModalViewController:YES];
SecondModalViewController *c = [[SecondModalViewController alloc] init];
[self.navigationController presentModalViewController:c animated:YES];
[c release];

Единственное, что происходит, - первый вид закрывается, но я не вижу второй открытый вид. Можно ли закрыть модальный ViewController и открыть второй таким же способом? Если да, то как?

Ответы [ 4 ]

7 голосов
/ 17 февраля 2012

Я думаю, что к тому времени, когда вы закроете первый контроллер вида, [self.navigation presentmodal ..] не сможет самостоятельно открывать новый контроллер.

Вы могли бы сделать это:

используйте логическую переменную, чтобы указать, будет ли в следующий раз отображаться этот контроллер (когда вы закрываете тот, который вы пытаетесь открыть), он должен закрыться и реализует эту функцию в методе viewDidApper: вот так:

@interface FirstViewController : UIViewController 
{
    //...
    BOOL close;
}

и в файле .m

-(void)viewDidAppear:(BOOL)animated{
    if(close)
        [self dismissModalViewControllerAnimated:NO];
    else
        [super viewDidAppear:animated];
}

Теперь, чтобы открыть свой новый контроллер, сделайте это:

-(IBAction)openSecondController:(id)sender{
    //..
    SecondViewController* controller = [[SecondViewController alloc]     initWithNibName:@"SecondViewController" bundle:nil];
    close = YES;
    [self presentModalViewController:controller animated:NO];
}

Теперь, когда вы закроете второй, закроется и первый. не имеет видимых побочных эффектов в моих приложениях ..

не самый чистый путь, но я не нашел лучшего. веселит

2 голосов
/ 29 марта 2011

Я делаю то же самое все время без проблем, хотя у меня есть animated:NO ... Я предполагаю, что ваша проблема в том, что у вас есть animated:YES на обоих.Какой эффект вы ищете именно?Хотите ли вы, чтобы один оживился, а другой оживился?Если это так, вам нужно выполнить presentModalViewController с задержкой.

В противном случае вы должны просто иметь возможность представить второй контроллер модального представления, не закрывая первый вообще.Когда вы вызываете dismissModalViewController;это должно отклонить оба.

0 голосов
/ 06 июня 2017

Вы можете использовать дескриптор uiviewcontroller, закрытый, и открыть другой с помощью Размотки сегментов.

https://developer.apple.com/library/content/technotes/tn2298/_index.html

0 голосов
/ 23 апреля 2012

Я нахожу точно такой же ответ. Это похоже на стандартное поведение.

То, как я обошел это, - это использовать executeSelector: withObject: afterDelay:

[self performSelector:@selector(presentController:) withObject:navController afterDelay:0.5f];

Единственным недостатком было то, что мне пришлось установить функцию presentController, которая затем выполняла presentModalViewController: animated:

Я пытался использовать NSInvocation, но продолжал получать ошибку неверного доступа, когда пытался передать BOOL для анимированного аргумента.

Главное, что это работает, и мой клиент счастлив.

...