web-dev-qa-db-ja.com

警告:既に表示されている*に*を表示しようとしました(null)

これはiOS向けの私の最初のアプリケーションです。

表示するTableCellsをフィルタリングするためにUIVIewControllerUITableViewを統合したUISearchBarUISearchControllerがあります

_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を開くために、モーダルセグエも使用しています。

_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)
    })
}
_
40
Splendf

私は解決策を見つけました。

HomeViewController.viewDidLoadに次のコードを追加しましたが、動作します!

definesPresentationContext = true
62
Splendf

私の場合、新しいviewController(UIAlertController)が2回呼び出されていることを示すコードを見つけました。

definesPresentationContextをいじる前にこれを確認してください。

22
grahamparks

私の場合、前のUIViewControllerを閉じる前に、新しいUIViewControllerを表示するのが早すぎました。この問題は、わずかな遅延を伴う呼び出しによって解決されました。

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

これは私たちのプロジェクトで私に起こりました。ログイン/ログアウト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)
}
3
Brandon A

私の場合、同じUIAlertControllerUISearchControllerを使用した後、アプリのライフタイムのある時点でUINavigationControllerを表示しようとしました。

UISearchControllerを正しく使用しておらず、searchController.isActive = false却下する前。後でアプリでアラートを表示しようとしましたが、検索コントローラーは、まだ表示されていませんでしたが、まだプレゼンテーションコンテキストを制御していました。

2
Clay Ellis

私は同じような問題に直面しました私がやったことは、インターフェイスビルダーから私のセグエを選択しました

プレゼンテーションを「デフォルト」に変更しましたが、それでうまくいきました。

2
Prasanna Kumar

SideMen(jonkykong)内で呼び出したVCを表示しようとしたときに、同じ問題が発生しました。

最初にSideMenu内で試してみましたが、デリゲートからMainVCに呼び出しましたが、どちらにも同じ問題がありました。

解決策:最初にSideMenuを閉じて、新しいVCを提示すると、完全に機能します!

0
Lahiru Pinto

私にとっての問題は、2つのモーダルを提示していたので、両方を閉じてから親ウィンドウでいくつかのコードを実行する必要があるということです...そしてこのエラーがあります...最後にこのコードを設定して解決しましたモーダル表示:

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

言い換えれば、単に2回却下するのではなく、2回目の却下を実行する最初の却下呼び出しデリゲートの完了ブロックで。

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
Iman

私のプロジェクトにはNavigationVCがなく、代わりに個々の独立したVCがあるため、これが最終的に私にとってうまくいったものです。 xibファイルとして

このコードはバグを生成しました:

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

このコードはバグを修正しました:

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