これはiOS向けの私の最初のアプリケーションです。
表示するTableCellsをフィルタリングするためにUIVIewController
とUITableView
を統合した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
を開くために、モーダルセグエも使用しています。
_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)
})
}
_
私は解決策を見つけました。
HomeViewController.viewDidLoad
に次のコードを追加しましたが、動作します!
definesPresentationContext = true
私の場合、新しいviewController(UIAlertController
)が2回呼び出されていることを示すコードを見つけました。
definesPresentationContext
をいじる前にこれを確認してください。
私の場合、前のUIViewControllerを閉じる前に、新しいUIViewControllerを表示するのが早すぎました。この問題は、わずかな遅延を伴う呼び出しによって解決されました。
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.callMethod()
}
これは私たちのプロジェクトで私に起こりました。ログイン/ログアウト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)
}
私の場合、同じUIAlertController
でUISearchController
を使用した後、アプリのライフタイムのある時点でUINavigationController
を表示しようとしました。
UISearchController
を正しく使用しておらず、searchController.isActive = false
却下する前。後でアプリでアラートを表示しようとしましたが、検索コントローラーは、まだ表示されていませんでしたが、まだプレゼンテーションコンテキストを制御していました。
私は同じような問題に直面しました私がやったことは、インターフェイスビルダーから私のセグエを選択しました
プレゼンテーションを「デフォルト」に変更しましたが、それでうまくいきました。
SideMen(jonkykong)内で呼び出したVCを表示しようとしたときに、同じ問題が発生しました。
最初にSideMenu内で試してみましたが、デリゲートからMainVCに呼び出しましたが、どちらにも同じ問題がありました。
解決策:最初にSideMenuを閉じて、新しいVCを提示すると、完全に機能します!
私にとっての問題は、2つのモーダルを提示していたので、両方を閉じてから親ウィンドウでいくつかのコードを実行する必要があるということです...そしてこのエラーがあります...最後にこのコードを設定して解決しましたモーダル表示:
self.dismiss(animated: true, completion: {
self.delegate?.callingDelegate()
})
言い換えれば、単に2回却下するのではなく、2回目の却下を実行する最初の却下呼び出しデリゲートの完了ブロックで。
私にとって、それは新しい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)
}
私のプロジェクトにはNavigationVCがなく、代わりに個々の独立したVCがあるため、これが最終的に私にとってうまくいったものです。 xibファイルとして
このコードはバグを生成しました:
present(alertVC, animated: true, completion: nil)
このコードはバグを修正しました:
if presentedViewController == nil{
navigationController?.present(alertVC, animated: true, completion: nil)
}