警告:试图提出*月*这已经是呈现(空)

问题描述 投票:40回答:10

这是我的iOS首次应用。

所以,我有,我已经集成了一个UIVIewControllerUITableView为了过滤TableCells显示UISearchBar一个UISearchController

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()
}

我为了打开元素的ViewController在那里我将显示元素的细节还采用模态SEGUE。

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()功能,但在那之后,当搜索被激活我以前的错误。

任何想法 ?我曾尝试使用下面的异步分派但没有成功

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.index = indexPath.row
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.performSegueWithIdentifier("ItemDetailFromHome", sender: self)
    })
}
ios swift uitableview uiviewcontroller uistoryboardsegue
10个回答
62
投票

我已经找到了解决办法。

我在HomeViewController.viewDidLoad和作品添加以下代码!

definesPresentationContext = true

0
投票

我的问题是,我描述了两种模态,我不得不关闭这两个,然后在执行父窗口的一些代码...然后我有这样的错误......我解决了它塞汀这个代码在解雇○最后模式呈现:

self.dismiss(animated: true, completion: {
                self.delegate?.callingDelegate()
            })

换句话说,而不只是解雇两次..第一驳回呼叫代理,将执行第二解雇完成块。


24
投票

就我而言,我发现这是被称为两次我的代码来呈现新的viewController(一UIAlertController)。

definesPresentationContext搞乱之前,请确认。


12
投票

就我而言,我想太早关闭前一个前以显示新的UIViewController。这个问题是通过稍微延迟一个电话解决:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
     self.callMethod()
}

3
投票

这事与我我们的项目。我提出我们登录/注销ViewController作为一个弹出式结束。但每当我试图重新登录了一次又一次显示弹出式结束后,我得到这个登出我的控制台:

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

我的猜测是,仍然被关押在我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)
}

2
投票

我面临同样的问题我所做的是从界面生成器选择我赛格瑞它的种类是“当前模态”,其表现为“在目前情况下”

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


2
投票

在我来说,我是想在同一UIAlertController使用UISearchController后,在应用程序的生命周期某些时候呈现UINavigationController

我没有正确地使用UISearchController忘解雇之前设置searchController.isActive = false。后来在应用我想提出警告,但搜索控制器,虽眼不能见的时候,仍然控制表示上下文。


0
投票

这是最终为我工作,因为我的项目并没有完全有NavigationVC而是单独分离VC的。如厦门国际银行文件

此代码产生的错误:

present(alertVC, animated: true, completion: nil)

此代码固定的错误:

 if presentedViewController == nil{
        navigationController?.present(alertVC, animated: true, completion: nil)
    }

0
投票

对我来说,这是与新的VC,我正要提出干扰警报。

所以,我搬到了新的VC目前的代码到我的警戒OK一部分,就像这样:

    func showSuccessfullSignupAndGoToMainView(){

    let alert = UIAlertController(title: "Alert", message: "Sign up was successfull.", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
        switch action.style{
        case .default:
            // Goto Main Page to show businesses
            let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
            let vc : MainViewController = mainStoryboard.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController
            self.present(vc, animated: false, completion: nil)

        case .cancel:
            print("cancel")

        case .destructive:
            print("destructive")

        }}))
    self.present(alert, animated: true, completion: nil)
}

0
投票

我得到了同样的问题,当我试图提出一个VC其称为SideMenu(jonkykong)内。

首先我想侧面菜单内,我把它叫做从委托到电源都有过同样的问题。

解决方案:首先驳回SideMenu并提出新的VC意志完美的作品后!

© www.soinside.com 2019 - 2024. All rights reserved.