警告:尝试在已呈现的MainTableViewController上呈现ModalTableViewController(null)

时间:2014-08-08 22:28:44

标签: ios cocoa-touch popover

我遇到弹出窗口问题。如果我点击一个单元格,我将加载一个弹出框以选择更多细节。一切正常,但当我再次按下我的手机时,我每次都收到以下消息:

警告:尝试在MainTableViewController上呈现ModalTableViewController ... ...已经呈现(null)

如果我点击另一个单元格,我将不会收到此警告。只有再次点击同一行时才会显示。

我尝试了很多东西,但我无法解决这个问题。我像这样加载我的popover:

var popover: UIPopoverController!
var popoverContent: ModalTableViewController!

在我的手机上点按:

popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("ModalTableViewController") as ModalTableViewController

popoverContent.selectedQuestionID = indexPath!.row               
popover = UIPopoverController(contentViewController: popoverContent)
popover.delegate = self

popover.presentPopoverFromRect(currentCell.LabelCellTitle.frame, inView: currentCell.LabelCellTitle.superview, permittedArrowDirections: UIPopoverArrowDirection.Left, animated: true)

并解雇

func popoverControllerDidDismissPopover(popoverController: UIPopoverController!) {

    popover.dismissPopoverAnimated(false) // just to check

    self.popover = nil
    self.popoverContent = nil

}

有什么想法吗?

编辑:

如果我查看:

if(self.popoverContent == nil) {
在打开它之前,我会发现当我再次敲击同一个细胞时它不是零。

再次编辑:

如果我使用一些不同的设置创建它,我会遇到同样的问题:

自定义1x1px按钮。用popue连接popover。在单元格上点击移动按钮到单元格并打开弹出窗口。

因此没有用于打开弹出窗口的代码,只有故事板编辑器。

如果我再次点击相同的弹出窗口,我会得到相同的错误消息(有时)。

9 个答案:

答案 0 :(得分:137)

我有这个问题,因为我试图从内部执行segue / present:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

我把它改为:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex

它修好了!

答案 1 :(得分:55)

我还没有快速,但是对于Objective-C,我最终在performSelector调用中包装了presentViewController调用。

-(void) present
{
    [self performSelector: @selector(ShowModalTableViewController) withObject: nil afterDelay: 0];
}

-(void) ShowModalTableViewController
{
    [self presentViewController: ctrlModalTableViewController animated: true completion: nil];
}

答案 2 :(得分:52)

这也可以:

dispatch_async(dispatch_get_main_queue(), ^ {
        [self presentViewController:vc animated:YES completion:nil];
});

答案 3 :(得分:5)

在弹出窗口上呈现任何内容似乎都是如此。之前所有响应都起作用的原因可能是因为在弹出窗口(或活动表或类似内容)被取消之前所采取的任何操作都会发生。

如果可以,请先尝试解除弹出窗口,然后展示你的模态。

答案 4 :(得分:4)

这实际上是 iPad 上的 iOS 8 问题,并且不会出现在8以下的 iOS 中。可以在那里提出一个条件:

if ([controller respondsToSelector:@selector(popoverPresentationController)])
{
    // iOS8
    controller.popoverPresentationController.sourceView = self.view; // or any of your UIiew
}

但是考虑到史蒂夫的观点(https://stackoverflow.com/a/26380194/362310)下面的代码更改。

答案 5 :(得分:4)

轻松将此代码段添加到主uiviewcontroller的ViewDidLoad()

 definesPresentationContext = true

答案 6 :(得分:3)

例如,如果在新视图控制器演示调用时显示UIActionSheet,则会发生这种情况 这段代码适合我

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [controller presentViewController:modalViewController animated:YES completion:NULL];
    }];

答案 7 :(得分:1)

对我来说,这发生在我将两个UIBarButton项目作为NavigationItem的一部分并且两者都有一个触发的segue来打开视图作为弹出窗口时 - 使用它们自己的控制器。当点击另一个BarButtonItem时,一个弹出窗口不会自动关闭。然而,当我在弹出窗口外的其他地方敲击时,它会解雇。 我最终重写了UINavigationController并添加了presentViewController:animated:completion

的扩展版本
/*
 * Workaround for apparent bug in iPad that popover does not automatically dismiss if another bar button item is pressed
 */

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

    /*
     * Make sure this runs in the main queue
     */
    dispatch_async(dispatch_get_main_queue(), ^ {
        if (
            [self.presentedViewController isKindOfClass:[ViewController1 class]]
            || [self.presentedViewController isKindOfClass:[ViewController2 class]]
            || [self.presentedViewController isKindOfClass:[ViewController3 class]]
            || [self.presentedViewController isKindOfClass:[ViewController4 class]]
            ) {
            [self dismissViewControllerAnimated:YES completion:^{
                [super presentViewController:viewControllerToPresent animated:flag completion:completion];
            }];
        }

        else {
            [super presentViewController:viewControllerToPresent animated:flag completion:completion];
        }
    });
}

我认为dispatch_async(dispatch_get_main_queue(), ^ {})并非真的有必要,我只是将其作为预防措施添加。

答案 8 :(得分:0)

在我的情况下,我不小心将我的按钮同时链接到IBActionStoryboard Segue种类Present As Popover。我要解决的问题是删除我的按钮的Touch Up Inside事件链接到IBAction并仅使用Storyboard Segue