-dismissModalViewControllerAnimated:适用于iPhone而非iPad

时间:2010-09-28 18:47:16

标签: iphone objective-c modalviewcontroller

我在获取-dismissModalViewControllerAnimated时遇到问题:在iPad上工作(作为iPhone应用程序)。出于某种原因,它似乎没有做任何事情。

我在MainViewController中调用 -presentModalViewController:animated:,之后我尝试从显示的视图控制器中调用 -dismissModalViewController (使用 [self dismissModalViewController] ] ),我理解将请求转发给MainViewController。我还尝试在呈现的视图控制器中设置一个委托( viewControllerAboutToBePresented.delegate = self; ),然后调用 [self.delegate dismissModalViewController:YES] 。当我在iPad上运行iPhone应用程序时,这两种方法似乎都没有做任何事情。

如何解除iPad上的模态视图控制器?

2 个答案:

答案 0 :(得分:1)

我第一次将iPhone项目移植到iPad时就已经有了这个... - [self dismissModalViewControllerAnimated:]正在悄然失败。该项目在OpenGL背景上使用Cocoa视图控制器,我认为这与此有关。

由于截止日期非常紧张,我没有时间弄清楚发生了什么,所以我只是将模态视图添加为当前视图控制器的子视图,并在完成后将其删除。 (是的,一个黑客,但这是你的时间表...)

答案 1 :(得分:0)

我发布此评论作为评论,但我无法这样做。

主视图控制器应该调用 dismissModelViewControllerAnimated:。您可以在显示的视图控制器中调用 [[self parentViewController] dismissModalViewControllerAnimated:] ,或者在协议中定义一个方法,该方法关闭模式视图控制器并在主视图控制器中实现协议,将其设置为显示的视图控制器的委托并从中调用方法。你这样做是错误的。它可能会或可能不会解决您的问题。

更新(评论时无法使用代码示例):

在MainViewController上你应该有这样的东西

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // In this case is inside a tableviewmethod, but it could really be an action associated with a button.

    DetailViewController *controller = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]];
    [controller setDelegate:self]; // The delegate is the parent and is assigned, not retained.

    // Modal presentation style is only used on iPad. On iPhone is always full screen.
    // [controller setModalPresentationStyle:UIModalPresentationFullScreen];

    [controller setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
    [self presentModalViewController:controller animated:YES];
    [controller release]; // It will be deallocated upon dismissal.
}

-(void)dismissDetailViewControllerAndProcessData:(NSDictionary *)data {

    // Do something with the data passed.
    [self processData:data];

    // Dismiss the modalviewcontroller associated with this viewcontroller.
    [self dismissModalViewControllerAnimated:YES];
}

在作为模态视图控制器呈现的详细视图控制器上,唯一需要的是这样的

-(void)actionBack:(id)sender {

    // Call the delegate method. If you just need to dimiss the controller, just
    // call
    // [[self parentViewController]dismissModalViewControllerAnimated:YES];
    // and don't even bother to set up a delegate and a delegate method.

    [delegate dismissDetailViewControllerAndProcessData:nil]; // Call the parent dismissal method.
}

但是如果应用程序在iPhone上正常运行,它应该在iPad上和iPhone应用程序一样运行。