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

der*_*ida 49 cocoa-touch popover ios

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

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

如果我点击另一个单元格,我将不会收到此警告.仅当再次点击同一行时.

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

var popover: UIPopoverController!
var popoverContent: ModalTableViewController!
Run Code Online (Sandbox Code Playgroud)

在我的手机上点击:

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)
Run Code Online (Sandbox Code Playgroud)

并解雇

func popoverControllerDidDismissPopover(popoverController: UIPopoverController!) {

    popover.dismissPopoverAnimated(false) // just to check

    self.popover = nil
    self.popoverContent = nil

}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑:

如果我检查:

if(self.popoverContent == nil) {
Run Code Online (Sandbox Code Playgroud)

在打开它之前,我会发现当我再次敲击同一个细胞时它不是零.

再次编辑:

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

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

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

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

Ste*_*eve 137

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

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
Run Code Online (Sandbox Code Playgroud)

我改成了:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
Run Code Online (Sandbox Code Playgroud)

它修好了!

  • 这就是我的情况.简单解决一个愚蠢的问题. (14认同)

Aac*_*ace 55

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

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

-(void) ShowModalTableViewController
{
    [self presentViewController: ctrlModalTableViewController animated: true completion: nil];
}
Run Code Online (Sandbox Code Playgroud)

  • dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(0.0*NSEC_PER_SEC)),dispatch_get_main_queue(),^ {/*把代码放到这里执行*/}); 还为我修复了iOS 8,以防你不想创建一个新方法来调用相同的代码. (10认同)
  • 我有一个在IOS7中完美运行但在IOS8中遇到此问题的应用程序.这个技巧修复了它. (4认同)
  • 如果你是在ActionSheet按钮内单击 - 请尝试@ Steve的答案,使用didDismissWithButtonIndex (2认同)
  • 以上内容确实解决了iOS 8中的问题/错误.但这是一种破解方式.Steve转而使用didDismissWithButtonIndex的答案是更好的解决方案.看看史蒂夫的回答.它的工作量减少,而且不那么脆弱. (2认同)

Har*_*ris 52

这也可以:

dispatch_async(dispatch_get_main_queue(), ^ {
        [self presentViewController:vc animated:YES completion:nil];
});
Run Code Online (Sandbox Code Playgroud)

  • 这为我解决了类似的问题.但是我不明白为什么会这样.为什么我需要这样做?任何可以提供更多背景信息的链接? (4认同)
  • 我认为你提出的解决方案可能有用,但必须考虑作为一个讨厌的黑客.它解决了在解除前一个问题之前弹出的问题的根源.确保你已经解散旧的,然后展示新的.它的工作原理是它为主运行循环的下一次运行添加了一个更改 (4认同)
  • 它适用于iPad上的iOS 8.为什么会这样? (2认同)

Jef*_*eff 5

看来这是通过弹出窗口呈现任何东西都是如此.之前所有响应都起作用的原因很可能是因为在弹出窗口(或活动表或类似)被取消之前所采取的任何操作都会发生.

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