テーブルビューで選択アクションを処理する単純なテーブルビューがあります。このアクションはセグエに続きます。
セグエがPush
セグエの場合、次のビューがすぐに表示されます。セグエがmodal
セグエの場合、次のビューは次のいずれかです。
いくつかのアイデアを探してみましたが、私の状況に当てはまるものはありません。特に:
viewDidLoad
に問題はありません)。さらに、セグエがPush
のときにほぼ瞬時に表示されるという事実は、ターゲットビューの読み込みに問題がないことを示しています。nil
をsender
に渡そうとしました。同じ効果。誰もこれに関するアイデアを持っていますか?
(私には...)この問題は、セルselectionType
が.none
ではない場合にのみ発生するようです。
それを他のオプションに変更することができます(ストーリーボードAttribute inspector
で、Selection
フィールドを設定します)、それはうまく動作します(私のために働いています...)。短所は、セルUIを台無しにすることです。
前に述べたように、didSelect
のUITableViewDelegate
デリゲート関数のDispatchQueue.main.async{}
ブロックでセグエを呼び出すことができます。
最初のソリューションを使用し、セル自体に追加しました-
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(false, animated: false)
}
これにより、タップ時にセルが「強調表示」されますが、すぐに通常のUIに戻り、私にとってはうまくいきます...
セグエの実行が適切に機能しない場合、さまざまな状況があるようです。たとえば、アンワインドセグエのアクションハンドラからperformSegue
を呼び出すと、メインスレッドにいる場合でもさまざまな問題が発生します。現在のプロジェクトでは、Table ViewのperformSegue
メソッドからdidSelectRowAt
を呼び出しています。これは最も基本的なセグエの1つであり、もちろん私はメインスレッドにいますが、OPが説明した正確な症状を見ていました。
他の人ではなく、なぜこれが起こるのかはわかりませんが、performSegue
を使用してasync
呼び出しを延期すると、潜在的な問題が修正されることがわかりました。これはハックのように見えて緊張しましたが、この時点でこのアプローチを使用したいくつかの成熟したプロジェクトがあり、手動のセグエを行う「正しい」方法のように見えます。
Swift 3バージョンのコードです(Swift 2およびObj-Cバージョンに関する他の投稿を参照):
DispatchQueue.main.async {
self.performSegue(withIdentifier: "theIdentifier", sender: theSender)
}
受け入れられたソリューションは私のために働いた。 Swift 2.0以下のために更新されたコード:
dispatch_async(dispatch_get_main_queue(),{
self.performSegueWithIdentifier(mysegueIdentifier, sender:self)
})
これがSwiftでプログラム的にモーダル遷移を作成できることを願っています:
let myStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let modalViewController = myStoryboard.instantiateViewControllerWithIdentifier("myModalViewController") as! myModalViewController
modalViewController.modalTransitionStyle = UIModalTransitionStyle.CoverVertical
let navController = UINavigationController(rootViewController: accountManager)
dispatch_async(dispatch_get_main_queue(),{
self.presentViewController(navController, animated: true, completion: nil)
})
サブクラス化によってコードを整理する開発者向けに、共有したい非常に簡単なソリューションになりました(Swift 4):
import UIKit
class ABCViewController: UIViewController {
// ... Other useful methods like overriding deinit and didReceiveMemoryWarning
// Performs a segue on the main thread to ensure it will
// transition once a UI-slot is available
func performSegueOnMainThread(with identifier: String, sender: Any?) {
DispatchQueue.main.async {
self.performSegue(with: identifier, sender: sender)
}
}
}
次に、実装から単に呼び出します。
myViewController.performSegueOnMainThread(with: "ShowDetailsSegue", sender: self)
私にとっては、次のビューで「クリア」な色のビューが多すぎたため、セグエがアニメーション化されたとき、このために遅れているように見えました。 View ControllerのUI階層を調べて、明確な色を探し、それらを黒一色または白一色に置き換え、アルファが1であることを確認しました(そうでない場合は必要ありません)。遅延がなくなり、モーダルプレゼンテーションがスムーズになりました。