web-dev-qa-db-ja.com

ストーリーボードエディターの「First Responder」ボックスと「Exit」ボックスの目的は何ですか?

XCode IDEでは、MainStoryboardエディターのビューコントローラーの下部に、First ResponderとExitの2つのボックスがあります。

FirstResponderがプログラム的にコード内で何であるかを知っていますが、ストーリーボードエディターでは、それによって役立つことを何も実行できないようです。

この領域の最初のレスポンダーを使用して、なんとかしてビューの最初のレスポンダーを設定できますか?ロード時に最初のテキストフィールドをアクティブにしたいのですが、右クリックしてドラッグしても何も起こりません。私はそれをviewDidLoadメソッドでプログラムで設定できることを知っていますが、ここでそれを行う方法はありますか?

そして、緑の出口は何ですか?

First Responder (orange) and Exit (Green) - what are they for?

30
Madivad

私はこれを使用したことはなく、おそらく使用することはありませんが、UIからイベントを受信するためにオブジェクトを最初にインラインで割り当てることができます。

UIViewサブクラスを作成してUIViewControllerに追加することもできますが、実際には、追加するUIViewController以外のオブジェクトを受け取ってイベントを処理する必要があります。

8
Fogmeister

この質問に対する良い答えはないので、私は私の答えを投稿しています:

ここ から:

注:おそらくFirst Responderをあまり使用しないでしょう。これは、任意の時点でファーストレスポンダステータスを持つオブジェクトを参照するプロキシオブジェクトです。それはあなたのペン先にもあり、おそらくあなたもそれを使う必要はなかったでしょう。例として、Touch Up InsideイベントをボタンからFirst Responderのcut:セレクターに接続できます。ある時点でテキストフィールドに入力フォーカスがある場合は、そのボタンを押して、最初のレスポンダーとなったテキストフィールドをテキストをペーストボードにカットできます。

編集:

1)First Responderは、キーボード通知でテキストフィールドを使用している場合に非常に役立ちます。私はそれを使用してキーボードを非表示にし、クラスの変数currentFirstResponderへのアウトレットを作成し、viewWillDisappearで:

[self.currentFirstResponder resignFirstResponder];

2)アンワインドセグエ(「終了」ボックス)について読むことができます ここ

9
Borzh

First Responder:First Responderアイコンは、ユーザーが現在操作しているオブジェクトを表します。ユーザーがiOSアプリケーションを操作すると、複数のオブジェクトが、ユーザーが作成したさまざまなジェスチャーやキーストロークに応答する可能性があります。ファーストレスポンダは、現在制御され、ユーザーと対話しているオブジェクトです。たとえば、ユーザーが入力しているテキストフィールドは、ユーザーが別のフィールドまたはコントロールに移動するまで最初のレスポンダーになります。

Exit:[Exit]アイコンは、マルチシーンアプリケーションでのみ機能する非常に特定の目的を果たします。ユーザーを一連の画面間で移動するアプリを作成している場合、Exitアイコンは、前の画面に戻る視覚的な手段を提供します。 1つのシーンから別のシーンにリンクする5つのシーンを作成し、5番目のシーンから最初のシーンにすばやく戻る場合は、5番目のシーンから最初のシーンの終了アイコンにリンクします。

詳細 ここ

2
Sayooj

これはあまり見られません。削除された回答は実際に正しいので、そのコメント(削除に影響している可能性が高い)は完全に間違っています。私はそれを改善しようとします。

通常、ボタンに接続するIBActionは、ボタンを含むビューコントローラにあります。ただし、IBActionが別のコントローラーにある場合、次に、親コントローラーをボタンからFirst Responderオブジェクトにドラッグすると、親コントローラーでIBActionを選択できます。

隠された答えが述べるように、これがどのように実装されるかは、アクションがnilに送信されることです。これは、次のように、アクションを検索するレスポンダーチェーン(つまり、ビュー階層)に影響します。

[UIApplication.sharedApplication sendAction:@selector(nextObject:) to:nil from:self forEvent:nil];

例はカスタムUITableViewCellです。セルにUIButtonを追加しますが、UITableViewControllerへの埋め込みセグエを持つビューコントローラーにアクションを移動させます。タッチアップではなくアクションをファーストレスポンダにドラッグし、コンテナビューコントローラでアクションを選択します。 indexPathを見つけるアクションでは、単にvisibleCellsをループし、送信者がisDescendantOfViewかどうかを確認します。

- (IBAction)cellButtonTapped:(id)sender{
    for(UITableViewCell *cell in self.tableViewController.tableView.visibleCells){
        if([sender isDescendantOfView:cell]){
            NSIndexPath *indexPath = [self.tableViewController.tableView indexPathForCell:cell];
            NSLog(@"tapped %@", indexPath);
        }
    }
}

別の例としては、再読み込みボタンがあります。最初のビューコントローラーにIBActionを使用してダウンロードしたアイテムを表示し、最新のデータを取得するために再読み込みします。次に、子コントローラーに詳細を表示しますが、それらもできるようにしたいとします。詳細内からメインアイテムを再読み込みするには、詳細にボタンを追加し、そのアクションをFirst Responderにドラッグして、親コントローラーでreload IBActionを選択します。これにより、デリゲートメソッドのような追加のコードなしでボタンを親アクションにフックできます。

これが機能するためには、アクションがレスポンダーチェーン階層にある必要があります。そうでない場合、アクションは見つかりません。チェーンがどのように構築されているかをドキュメントで確認できます。また、コードから呼び出された場合、ビューが表示されている必要があります。viewWillAppearは早すぎます。

0
malhal