警告:试图在已经呈现的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连接到一个IBAction
和Storyboard Segue
同时Present As Popover
种类。 我做了什么来解决这个问题是删除我的button的Touch Up Inside
事件链接到IBAction
并只使用Storyboard Segue
。