ios-警告:尝试在已显示的*上显示*(空)

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

所以我有一个ItemDetailViewController.viewDidLoad()UISearchController,在这里我集成了UISearchBarUISearchController以过滤要显示的TableCell

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

我还使用模态搜索,以打开元素的ItemDetailViewController.viewDidLoad(),在其中显示元素的详细信息。

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.viewDidLoad()过滤后的元素(通过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)
    })
}
12个解决方案
63 votes

我找到了解决方案。

我在HomeViewController.viewDidLoad中添加了以下代码,该方法有效!

definesPresentationContext = true
Splendf answered 2020-08-11T16:57:06Z
25 votes

就我而言,我发现我的代码提出了新的viewController(definesPresentationContext)被调用了两次。

在弄乱definesPresentationContext之前,请先检查此内容。

grahamparks answered 2020-08-11T16:57:30Z
13 votes

就我而言,在关闭上一个UIViewController之前,我尝试过早显示它。 该问题通过稍有延迟的电话得以解决:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
     self.callMethod()
}
Pavel Kataykin answered 2020-08-11T16:57:53Z
3 votes

这在我的项目中发生了。 我正在以弹出窗口的形式展示我们的登录/注销ViewController。 但是,每当我尝试再次注销并再次显示弹出窗口时,我都会在控制台中注销该消息:

ViewController

我的猜测是该弹出窗口仍被我的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)
}
Brandon A answered 2020-08-11T16:58:31Z
2 votes

我遇到了同样的问题我所做的是从“界面构建器”中选择我的segue同类为“模态呈现”其介绍是“在当前背景下”

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

Prasanna Kumar answered 2020-08-11T16:58:57Z
2 votes

在我的情况下,我试图在相同的UINavigationController中使用searchController.isActive = false之后,在应用程序的生命周期中的某个时刻展示UISearchController

我没有正确使用UISearchController,并且在解雇之前忘记设置searchController.isActive = false。 后来在应用程序中,我尝试显示警报,但是搜索控制器虽然当时不可见,但仍在控制显示上下文。

Clay Ellis answered 2020-08-11T16:59:22Z
0 votes

这最终对我有用,因为我的项目没有完全具有NavigationVC,而是单独的独立VC。 作为Xib文件

这段代码产生了这个错误:

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

此代码修复了该错误:

 if presentedViewController == nil{
        navigationController?.present(alertVC, animated: true, completion: nil)
    }
KarmaDeli answered 2020-08-11T16:59:51Z
0 votes

对我来说,这是一个警报,正在干扰我将要介绍的新VC。

所以我将新的VC present代码移到了警报的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)
}
Iman answered 2020-08-11T17:00:17Z
0 votes

当我尝试介绍在SideMenu(jonkykong)内部调用的VC时,出现了相同的问题。

首先,我在侧边菜单中尝试了一下,然后从委托人到MainS进行了调用,两者都存在相同的问题。

解决方案:先关闭SideMenu,然后再显示新的VC即可正常运行!

Lahiru Pinto answered 2020-08-11T17:00:46Z
0 votes

对我来说,问题是我正在呈现两个模式,必须先关闭这两个模式,然后在父窗口中执行一些代码...然后出现此错误... 模态表示:

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

换句话说,而不是仅仅两次关闭..在将执行第二次关闭的第一个关闭调用委托的完成块中。

Hiram Elguezabal answered 2020-08-11T17:01:12Z
0 votes

我的问题是我试图从一个不在最上面的视图中发出警报。 确保您从最顶层的viewController进行展示。

powertoold answered 2020-08-11T17:01:33Z
0 votes

就我而言,这是一个在Interface Builder中重复的按钮的问题。 原始按钮上装有触摸处理程序,该按钮还提供了模式视图。 然后,当我在复制的按钮上附加一个修饰处理程序时,我忘了从原始操作中删除复制的处理程序,导致两个处理程序都被触发,从而产生警告。

Mads Mobæk answered 2020-08-11T17:01:53Z
translate from https://stackoverflow.com:/questions/32696615/warning-attempt-to-present-on-which-is-already-presenting-null