0

私が取り組んでいるアプリの一部には、ユーザーが非アクティブになった場合に現在のコンテンツの上に空白の画面を配置することが含まれます。そのため、x 秒後に空白のページ ビュー コントローラーが開かれます。

(ViewController.m 内から、ScreenBlank.m からの NSNotification の検出によってトリガーされます)

UIPageViewController *blankPage = [self.storyboard instantiateViewControllerWithIdentifier:@"BlankPageViewController"];
[self presentViewController:blankPage animated:YES completion:nil];

この空白の画面は、ユーザーが画面に触れると削除されます (したがって、ユーザーのアクティビティが確認されます)。

(ViewController.m の touchesBegan コールバック内から)

[self dismissViewControllerAnimated:YES completion:nil];

私が抱えている問題は、ユーザーがログアウトしたときなど、この画面の空白を他の場所で削除することをトリガーしたいということです。これは、プラグインされたカードリーダーからカードを取り外すことによって行われ、別のクラス (および ActionMgr.m 内からインスタンス化されたクラス) から呼び出されることを意味します。

問題のクラス (CardWatcher) は次のように作成されます。

CardWatcher *newInstance = [[CardWatcher alloc] init];
[newInstance StartCardChecker];

そして、その CardWatcher のインスタンスは、カードが取り外されたときに次のように通知を発行します。

[[NSNotificationCenter defaultCenter] postNotificationName:@"logout" object:nil];

この通知は ViewController でリッスンされ、トリガーされると、以前に画面を空白にするために使用されたものとまったく同じコードを実行します。

[self dismissViewControllerAnimated:YES completion:nil];

ロギングを使用して、通知が正常に受信されていることを確認し、dismissViewControllerAnimated コードを実行していますが、何らかの理由で、このコードは実際にはビュー コントローラーを閉じていません。

私が考えることができる唯一の理由は、それが(長期的には)クラスのインスタンス内でフォームと呼ばれているということですが、それでもNSNotificationを介して渡されているため、私の目にはそのソースは無関係であるはずですか?

どんな助けでも大歓迎です!

4

1 に答える 1

4

メインスレッドで通知が生成されていないように聞こえるため、セカンダリスレッドからページを閉じようとしています。セカンダリ スレッドからではなく、メイン スレッドに通知を投稿していることを確認してください。通知がこのような UI イベントをトリガーする場合、UI を操作するコードをメイン スレッドで実行する必要があります。

特定のスレッドへの通知の配信

通常の通知センターは、通知が投稿されたスレッドで通知を配信します。分散通知センターは、メイン スレッドで通知を配信します。場合によっては、通知センターではなく、ユーザーが決定した特定のスレッドで通知を配信する必要がある場合があります。たとえば、バックグラウンド スレッドで実行されているオブジェクトが、ウィンドウを閉じるなどのユーザー インターフェイスからの通知をリッスンしている場合、メイン スレッドではなくバックグラウンド スレッドで通知を受け取りたいと考えます。このような場合、デフォルト スレッドで配信される通知をキャプチャし、適切なスレッドにリダイレクトする必要があります。

次のコードを試してみて、うまくいったかどうかお知らせください。

 dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"logout" object:nil];
 });
于 2013-09-20T08:07:57.493 に答える