presentModalViewController из UIModalTransitionStylePartialCurl viewController - PullRequest
1 голос
/ 06 января 2012

У меня есть модальное представление, представленное с помощью перехода UIModalTransitionStylePartialCurl.В этом модальном виде есть кнопка, которую я хотел бы:

  1. закрыть текущий модальный вид (свернуть), затем
  2. представить новый модальный вид (вертикальная обложка).

Однако, когда я пробую следующее, оно просто отклоняет модальное представление curl, но не представляет новое:

[self dismissModalViewControllerAnimated:YES];
NewView *vc = [[NewView alloc] init];
[self.parentViewController presentModalViewController:vc animated:YES];

У меня такое чувство, что оно должноделать с этой последней строкой.Представление NewView на self тоже не работает.Как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 06 января 2012

Используете ли вы iOS 5?

Если это так, проблема, с которой вы сталкиваетесь, связана с задокументированным изменением: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/parentViewController

Важный бит по этой ссылке:

До iOS 5.0, если представление не имело родительского контроллера представления и было представлено модально, контроллер представления, который представлял его, был бы возвращен.Это больше не так.Вы можете получить контроллер представления, используя свойство presentingViewController.

Таким образом, изменение на self.presentingViewController может решить вашу проблему, но, вероятно, не удастся.

Использование этого кода из вашего первого модального:

[self dismissModalViewControllerAnimated:YES];
SecondViewController *sec = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
sec.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self.presentingViewController presentModalViewController:sec animated:YES];

Вы не видите представленный новый контроллер представления.

Чтобы получить то, что вы хотите, после того, как хотите использовать новый (начиная с iOS5) метод:

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion

Этот метод является рекомендуемой заменой для presentModalViewController.

И пользовательский метод на вашем первом контроллере представления, что-то вроде:

- (void)cycleModalViewControllersWithController:(UIViewController *)newViewController

Этот метод может отклонить ваш текущий модальный режим.и представьте новый, что-то вроде этого:

- (void)cycleModalViewControllersWithController:(UIViewController *)newViewController {
    [self dismissViewControllerAnimated:YES completion:^{
        [self presentViewController:newViewController animated:YES completion:NULL]; 
    }];
}

Используя блок завершения, чтобы запустить новый модал, давайте подождем, пока старый модал не оживит.Таким образом, в вашем втором контроллере модального вида вы должны вызывать свой собственный метод на вашем первом контроллере модального вида и позволять ему управлять отклонением / представлением нового.

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

Первое, что нужно проверить, будет, если self.parentViewController равен нулю или нет.

NSLog(@"parent == %@", self.parentViewController);

если это nil (в моем тесте это было ноль), вам нужно будет передать указатель вашему родителю в этом модальном представлении. И после этого вы можете сделать что-то вроде этого

[self.caller performSelector:@selector(launchNewView:) 
                  withObject:nil 
                  afterDelay:1.0];
[self.caller dismissModalViewControllerAnimated:YES];

здесь self.caller - это «родитель», который был установлен в UIViewController непосредственно перед тем, как он был представлен модально.
Я не считаю это идеальным решением, но оно работает в моем тесте.

...