警告:试图在已经呈现的*上显示*(null)

这是我第一个iOS应用程序。

所以我有UIVIewControllerUITableView我集成了UISearchBarUISearchController为了过滤TableCells显示

 override func viewDidLoad() { menuBar.delegate = self table.dataSource = self table.delegate = self let nib = UINib(nibName: "ItemCellTableViewCell", bundle: nil) table.registerNib(nib, forCellReuseIdentifier: "Cell") let searchButton = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: "search:") menuBar.topItem?.leftBarButtonItem = searchButton self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false return controller })() self.table.reloadData() } 

我也使用模态segue为了打开元素的ViewController ,我将显示元素的细节。

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { self.index = indexPath.row self.performSegueWithIdentifier("ItemDetailFromHome", sender: self) } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if (segue.identifier == "ItemDetailFromHome") { let settingsVC = segue.destinationViewController as! ItemDetailViewController settingsVC.parent = self if self.isSearching == true && self.searchText != nil && self.searchText != "" { settingsVC.item = self.filteredItems[self.index!] } else { settingsVC.item = self.items[self.index!] } } } 

这工作正常,直到我尝试显示一个过滤元素的ItemDetailViewController (通过UISearchController )。

我有以下消息:

 Warning: Attempt to present <ItemDetailViewController: *> on <HomeViewController: *> which is already presenting (null) 

在每次我去ItemDetailViewController.viewDidLoad()函数,但之后,当search被激活我有以前的错误。

任何想法 ? 我试图使用下面的asynchronous调度,但没有成功

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { self.index = indexPath.row dispatch_async(dispatch_get_main_queue(), { () -> Void in self.performSegueWithIdentifier("ItemDetailFromHome", sender: self) }) } 

我find了一个解决scheme。

我已经在HomeViewController.viewDidLoad添加以下代码,并且工作!

 definesPresentationContext = true 

在我的情况下,我发现我的代码呈现新的viewController( UIAlertController )被调用两次。

在讨论definesPresentationContext之前检查一下。

我面临同样的问题我所做的是从界面生成器中select我的segue它的types是“现在模态”,它的演示文稿是“Over current context”

我将演示文稿更改为“默认”,然后它为我工作。

这发生在我的项目上。 我是作为一个popup窗口来显示我们的login/注销ViewController 。 但是每当我尝试重新login并重新显示popup窗口时,我都会在控制台中看到这个消息:

Warning: Attempt to present UIViewController on <MY_HOME_VIEW_CONTROLLER> which is already presenting (null)

我的猜测是popup窗口仍然被我的ViewController保持,即使它不可见。

但是,您正试图显示新的ViewController ,下面的代码,我用来解决这个问题应该为你工作:

 func showLoginForm() { // Dismiss the Old if let presented = self.presentedViewController { presented.removeFromParentViewController() } // Present the New let storyboard = UIStoryboard(name: "MPTLogin", bundle: Bundle(for: MPTLogin.self)) let loginVC = storyboard.instantiateViewController(withIdentifier: "LogInViewController") as? MPTLogInViewController let loginNav = MPTLoginNav(rootViewController: loginVC!) loginNav.modalPresentationStyle = .pageSheet; self.present(loginNav, animated: true, completion: nil) }