3

アプリの起動時に、セグエを使用して LoginViewController をプログラムで表示します。ビュー コントローラーは、クロス ディゾルブに設定されたトランジションでモーダルに表示されます。認証が成功したら、プログラムでアンワインド セグエをトリガーして、ログイン ビューを閉じたいと思います。そこで、これをヘッダーファイルに追加しました:

- (IBAction)unwindSegue:(UIStoryboardSegue *)segue;

IB では、「ファイルの所有者」LoginViewController から [終了] ボタンにコントロールドラッグして、unwindSegue:. これにより、手動のセグエが作成され、ファイルの所有者と終了ボタンの接続インスペクターに正しく表示されます。次に、IB のシーンから新しく作成された Unwind セグエをクリックし、名前を付けます。unwind segue アクションの「go to」ボタンをクリックすると、上記の宣言に移動します。

これまでのところ、GCD ブロックでの認証が成功すると、このアンワインド セグエをトリガーします。

....
dispatch_async(dispatch_get_main_queue(), ^
{
    [self performSegueWithIdentifier:@"UnwindSegueIdentifier" sender:self];

    [self.spinner removeFromSuperview];
    self.spinner = nil;
});

...実行しても何も起こりません。スピナーは正しく削除されますが、アンワインド セグエが実行されている兆候はありません。

unwindSegue:never getsの実装のブレーク ポイントにヒットします。エラーはスローされません。コンソールには何も書き込まれません。識別子は正しいです。私はトリプルチェックしました(それ以外の場合はとにかく失敗します)。

herehere、およびhereの回答を見ましたが、何も見逃していないようです。

私が気づいたのは、Xcodeがリンクされ ていないunwindSegue:と考えていることです:リンク? リンクされていませんか?

の前にある小さな空の円からドラッグしunwindSegue:て終了ボタンにリンクすることができません。

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

4

2 に答える 2

8

モーダルセグエを使用してログインビューに移動している場合、戻る必要があるのは呼び出すことだけです

[self dismissViewControllerAnimated:YES completion:nil];

より正確には、提示元のコントローラー (最初のコントローラー) で呼び出す必要がありますが、提示されたコントローラーで at を呼び出すと転送されます。完了ブロックを使用して、必要なクリーンアップを行うことができます。GCD を使用する必要はありません。

編集

追加のコメントに答えるには:あなたの説明からはよくわかりませんが、提示されたコントローラーではなく、提示されたコントローラーで巻き戻しアクションを実装しようです。アンワインド セグエは、追加のプロトコルなしで呼び出し元で何かを実行できるようにすることです (たとえば、データの設定)。

于 2013-02-20T09:43:06.770 に答える
2

アンワインド セグエに関する Apple のテクニカル ノートからのテキストの引用: プログラムでのみトリガーされるアンワインド セグエを追加するには、コントロールを押しながらシーンのビュー コントローラー アイコンからその終了アイコンにドラッグし、ポップアップ メニューから新しいセグエのアンワインド アクションを選択します。

テクニカルノートへのリンク

于 2013-11-06T19:17:31.127 に答える