私のコードでは、サイドメニューで行われたアクションのための機能が定義されていますので、メニューのLogoutアクションをタップすると、menuDelegate?.selectionDelegate(Actions.Logout)
が実行され、以下の機能がコールバックを処理する委譲:Swift self.performSegueWithIdentifierは無作為に動作しません
@objc func sideMenuAction(action: action) {
if(action == .Logout){
dispatch_async(dispatch_get_main_queue(), {() -> Void in
self.performSegueWithIdentifier("unwindToLogin", sender: self)
})
}
}
9 out of 10
回、これは正常に動作し、これまでのナビゲーションスタックに、彼らがかもしれところからストーリーボードにunwindToLogin
識別子を持つビューコントローラにログインするために戻ってスローされたユーザの予想結果を持っています。 1回動作しないと、self.performSegueWithIdentifier
行が実行されても何も起こりません!エラーや警告は表示されず、行が実行された後にoverride func prepareForSegue
が呼び出されていません。
私が気付いたことは、この問題が発生したときにCPU使用率が100%を超えていることです。アプリの通常のCPU使用率は30%/ 40%で最大1/2秒です。
再生が難しく、何が起きているのか分かりません。考えられる原因をデバッグするためのヒントを探しています。
ビュー階層は、私は問題を再現することができた後は、次のようになります。
(lldb) expr -l objc++ -O -- [UIViewController _printHierarchy]
<SWRevealViewController 0x12585ea00>, state: appeared, view: <SWRevealView 0x1256f3c70>
| <demoApp.MenuViewController 0x12575daa0>, state: appeared, view: <UIView 0x12743e670>
| <UINavigationController 0x126047000>, state: appeared, view: <UILayoutContainerView 0x125755270>
| | <demoApp.InitialViewController 0x125760050>, state: disappeared, view: <UIView 0x1256e2b30> not in the window
| | <demoApp.MainViewController 0x1257f11f0>, state: disappeared, view: <UIView 0x1257f8df0> not in the window
| | <demoApp.DetailViewController 0x127617250>, state: appeared, view: <UIView 0x1274f2280>
私は、アプリケーションは二つの流れの影響ビュー階層を持っていることを追加する必要があります:
Flow 1: User has never provided credential so Login View -> Initial View -> Main -> ......
Flow 2: User has already logged in once so Initial View -> Main -> .......
ザ・ " unwindToLogin "識別子がアンワインドに属するIBActionのログインビューコントローラ
なぜ、好奇心から離れて、なぜあなたはdispatch_asyncの使用を選択しましたか?メインスレッドですでに実行が実行されていませんか? –
@AksharPatel私は妄想の理由を考えているのですが、どういうわけか実行時に私はサイドスレッドにあるので、安全な側になるようにしました。明らかに助けにならない。 – ke3pup
ビューコントローラの階層を追加しました。うーん、コントローラーはアンワインド 'IBAction'(あなたが移行しているコントローラーではなく、あなたが巻き戻しているものです)がそこに含まれていますか?どのビューコントローラがアンワインドの 'IBAction'を実装したのかは不明です。 – Rob