2016-05-22 4 views
0

私のコードでは、サイドメニューで行われたアクションのための機能が定義されていますので、メニューの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のログインビューコントローラ

+0

なぜ、好奇心から離れて、なぜあなたはdispatch_asyncの使用を選択しましたか?メインスレッドですでに実行が実行されていませんか? –

+0

@AksharPatel私は妄想の理由を考えているのですが、どういうわけか実行時に私はサイドスレッドにあるので、安全な側になるようにしました。明らかに助けにならない。 – ke3pup

+0

ビューコントローラの階層を追加しました。うーん、コントローラーはアンワインド 'IBAction'(あなたが移行しているコントローラーではなく、あなたが巻き戻しているものです)がそこに含まれていますか?どのビューコントローラがアンワインドの 'IBAction'を実装したのかは不明です。 – Rob

答えて

1

これは、アンワインドセグレットIBActionのメソッドが見つからない場合に発生しますビューコントローラ階層内の任意のビューコントローラ。そして、それはいろいろな理由で起こる可能性があります。おそらく、問題のビューコントローラは、ビューコントローラ階層内にまったく存在しないだけです。または、ビューコントローラの階層をビュー階層と同期させずに、あるビューコントローラから別のビューコントローラに移行したとします(たとえば、ビューコントローラのビューのうちaddSubviewを別のビューコントローラのビューの別のビューコントローラビューに変更する必要があります)。addChildViewControllerコール)。あるいは、手動でどこかでルートビューコントローラを手動で交換したかもしれません。しかし、ボトムライン、何らかの方法、いくつかの方法は、あなたのIBActionは、既存のビューコントローラ階層内の任意のビューコントローラでは、ほんのちょうど見つからない。

キーは、まずこれが起こる状況を見つけることです。 (再現するのは難しいと思っていますが、問題が明らかになるまで試してみてください)。実行したら、実行を一時停止し、View Controllerの階層を見てください。たとえば、あなたのデバッガで「一時停止」ボタンを押して(またはブレークポイントを追加)(lldb)プロンプトで次のように入力してビュー階層をして印刷スウィフトフレームであれば:

expr -l objc++ -O -- [UIViewController _printHierarchy] 

またはObjective-Cのフレームであれば

、単に:たとえば

po [UIViewController _printHierarchy] 

enter image description here

は、あなたの目的地のビューコントローラが目に表示されていることを確認しますeコントローラ階層を表示する。おそらく、そこには存在しません。そして、この問題を確認したら、問題のView ControllerがView Controller階層からどのようになくなったかを追跡して把握する必要があります。アプリで発生するすべてのView Controllerトランジションを見ると、標準トランジションを行っていないトランジションが見つかることがあります。

+1

提案に感謝します。私は元の質問にコマンドの出力を置いた。何か目立つ – ke3pup

関連する問題