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

我有一个popover的问题。 如果我点击一个单元格,我会加载一个popover来select更多的细节。 一切工作正常,但是当我再次按下我的细胞时,我收到每一次以下消息:

警告:尝试在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) { 

在打开它之前,我会发现当我再次点击同一个单元格时不是零。

再次编辑:

我有同样的问题,如果我创build一个不同的设置:

自定义1x1pxbutton。 连接popue与segue。 在单元格点击移动button到单元格并打开popup窗口。

所以没有打开popover的代码,只能用storyboard编辑器。

我得到相同的错误信息(有时),只要我再次点击相同的popup窗口。

我还没有迅速,但是对于Objective-C,我结束了在performSelector调用中包装presentViewController调用。

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

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

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

我把它改成:

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

它固定它!

这也将工作:

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

看起来这是真实的呈现任何东西超过popover。 所有以前的反应的工作原因可能是因为无论采取什么行动发生在popover(或活动表或类似的)被解雇之前。

如果可以的话,先尝试解散popover,然后展示你的模态。

这实际上是iPad上的iOS 8问题,不会发生在iOS 8以下。您可以在此处添加条件:

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

但是,考虑到Steve的观点( https://stackoverflow.com/a/26380194/362310 )以下代码更改。

如果在新视图控制器演示文稿调用时出现UIActionSheet,则会发生这种情况,例如此代码适用于我

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

只需将此代码片段添加到主uiviewcontroller的ViewDidLoad()中即可

  definesPresentationContext = true 

对我而言,当我将两个UIBarButton项作为NavigationItem的一部分时,发生了这种情况,并且都有一个触发的Segue来打开视图作为popup窗口 – 以及它们自己的控制器。 当点击其他BarButtonItem时,一个popup窗口不会自动closures。 然而,当我在stream行病之外的其他地方窃听时,它会被解雇。 我最终覆盖了UINavigationController并添加了presentViewController:animated:completion的扩展版本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(), ^ {})是不是真的有必要,我只是添加它作为预防措施。

在我的情况下,我不小心将我的button连接到一个IBActionStoryboard Segue同时Present As Popover种类。 我做了什么来解决这个问题是删除我的button的Touch Up Inside事件链接到IBAction并只使用Storyboard Segue