首先停用UIModalTransitionStylePartialCurl,打开一个新的UIVIewController

时间:2011-08-11 18:40:44

标签: iphone objective-c uiviewcontroller uimodaltransitionstyle

我有三个UIViewControllers:MainViewController,CurledViewController和SecondayViewController。

在MainViewController上我在MainViewController中有一个UIButton,它通过以下方式显示CurledViewController:

curled = [[CurledViewController alloc] init];
[curled setModalTransitionStyle:UIModalTransitionStylePartialCurl];
[self presentModalViewController:curled animated:YES];

从文档中我被告知:

  

使用此转换呈现的模态视图本身可以防止   提出任何其他模态视图。

这阻止我以这种方式显示CurledViewController时打开SecondaryViewController。我想做的是,在CurledViewController中选择UIButton时,关闭curl并打开SecondaryViewController(无论是来自CurledViewController的调用还是MainViewController无关紧要)。关闭SecondaryViewController后,我希望重新打开CurledViewController。

在CurledViewController中附加到UIButton的函数中,我尝试了这个:

- (void)showSecondary:(UIButton *)sender {
   [self.parentViewController dismissModalViewControllerAnimated:YES];
   SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:Nil];
   [self presentModalViewController:secondaryView animated:YES];
   ...
}

但仍然被告知,

Application tried to present a nested modal view controller while curled

如何以这种方式打开新的UIViewController?

谢谢!

1 个答案:

答案 0 :(得分:1)

这里的问题是用于呈现SecondaryViewController的代码仍在从CurledViewController执行。尝试的另一种方法是创建CurledViewControllerDelegate协议。使MainViewController成为CurledViewController的委托,并从showSecondary调用您的委托方法。

在CurledViewController中,您的方法可能如下所示:

- (void)showSecondary:(UIButton *)sender {
    [self.delegate dismissCurledViewController:self];
}

在MainViewController中,您的委托方法可能如下所示:

- (void)dismissCurledViewController:(CurledViewController *)controller {
    [self dismissModalViewControllerAnimated:NO];
    SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
    [self presentModalViewController:secondaryView animated:YES];
    …
}

修改

为了在新模态视图控制器的解雇和显示上保留动画,您需要引入一个延迟,以便第一个动画完成足够的时间。您可以通过使用适当的延迟值调用performSelector:withObject:afterDelay:来执行此操作。然而,这是一种容易出错的方法,因为它假定第一个动画将始终具有相同的持续时间。

在另一个问题中,作为Andrew Pouliot suggested,您还可以尝试覆盖MainViewController中的viewDidAppear:,以便它查找一个标志以确定是否应该显示SecondaryViewController。这仍然会使用我上面提到的委托方法,但MainViewController会有以下不同之处:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if(showSecondaryViewController) {
        SecondaryViewController *secondaryView = [[SecondaryViewController alloc] initWithNibName:@"Secondary" bundle:nil];
        [self presentModalViewController:secondaryView animated:YES];
    }

    showSecondaryViewController = NO;
}

- (void)dismissCurledViewController:(CurledViewController *)controller {
    showSecondaryViewController = YES;  
    [self dismissModalViewController:YES];
}