13

これはAppleのドキュメントにあると確信しているか、このフォーラムのどこかで回答されているに違いありません.

私が持っているのは、ナビゲーション スタックに編集ビューをプッシュする UIViewController です。編集ビューには、多数の UITextFields があります。textFieldShouldEndEditing戻るボタンがタッチされたときにそれらの 1 つが編集中の場合、 または の UITextField デリゲート メソッド、またはtextFieldDidEndEditingIB リンク アクションメソッドが呼び出される前に、元のビューの ViewWillAppear メソッドが呼び出さtextFieldEditingEndedれます。

より明確にすることを願っているいくつかのコードを次に示します。

UIViewController で:

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];
    NSLog( @"Entering view will appear for master view" );
    nameLabelField.text = objectToEdit.name;
}
- (IBAction) editMyObject: (id) sender {
    NSLog( @"Editing the object" );
    EditViewController *evc = [[EditViewController alloc] initWithNibName: @"EditTableView" bundle: nil];
    evc.editedObject = objectToEdit;
    [self.navigationController pushViewController: evc animated: YES];
    [evc release];
}

EditViewController <UITextFieldDelegate> で:

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];
    nameField.text = editedObject.name;
}
- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];
    NSLog( @"In viewWillDisappear" );
    if( [self.navigationController.viewControllers indexOfObject: self] == NSNotFound ) {
        NSLog( @"-- We are not in controller stack... the back button has been pushed" );
    }
}
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {
    NSLog( @"In textFieldShouldEndEditing" );
    // Store text field value here???
    // editedObject.name = nameField.text;
    return YES;
}
- (void) textFieldDidEndEditing: (UITextField *) textField {
    NSLog( @"In textFieldDidEndEditing" );
    // Store text field value here???
    // editedObject.name = nameField.text;
}
- (IBAction) textFieldEditingEnded: (id) sender {
    NSLog( @"In textFieldEditingEnded" );
    // Store text field value here???
    // editedObject.name = nameField.text;
}

ログは次のようになります。

[...] ビューに入ると、マスター ビューが表示されます[...]
オブジェクトを編集しています
[... ] ビューで表示されなくなります
[...] -- コントローラー スタックではありません... 戻るボタンが押されました
[ ...] 入力ビューがマスター ビューに表示されます
[...] In textFieldShouldEndEditing
[...] In textFieldEditingEnded
[...] In textFieldDidEndEditing

UIViewControllerself.editedObject.name = nameField.textにラベルが設定される前に設定したい。viewWillAppear

EditViewController の viewWillDisappear メソッドで、テキスト フィールドのいずれかが現在ファーストレスポンダーであるかどうかを確認し、そうであればテキストを取得して保存することを考えましたが、これは、もし私がテキスト フィールドを追加または変更します。

IB リンク アクションを実装して、textFieldEditingChangedキーストロークごとに編集済みオブジェクトにテキストを設定することもできますが、キーストロークごとに自分がどのテキスト フィールドであるかを把握する必要があるため、これもかなりのオーバーヘッドになります (ここでは示しただけですnameが、それらの全体の束)。

必要なのは、編集を終了するか、UIViewController で viewWillAppear が呼び出される前に編集が終了することを知ることだけで、nameFieldLabel が適切に設定されます。

4

3 に答える 3

17

わかりました。たくさんの Web サーフィン、フォーラムの読み取り、およびマニュアルの読み取りを行った後、簡単な解決策を見つけました。私が思ったように、それは非常に単純で、コードを 1 行追加しただけでした。viewWillDisappearEditViewContorllerのメソッドに、次のように単純に追加しました。

    [self.view.window endEditing: YES];

textFieldShouldEndEditingtextFieldEditingEnded、およびすべてが、マスター ビューの が実行textFieldDidEndEditingされる前に起動されます。viewWillAppear

したがって、viewWillDisappearメソッドは次のようになります。

- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];
    NSLog( @"In viewWillDisappear" );
    // Force any text fields that might be being edited to end so the text is stored
    [self.view.window endEditing: YES];
}

また、キーボードの「戻る」を処理するために既に配置されているメソッドは、ナビゲーション コントローラーの「戻る」ボタンも処理します。

Aaron と Jeff に感謝します。

于 2010-11-01T05:16:01.757 に答える
0

アクション メソッドにそのロジックを使用して、独自の [戻る] ボタンを作成してみませんか?

于 2010-10-31T04:35:19.013 に答える
-1

UX の観点からは、現在のビューを終了する前に、ユーザーが途中で行っていた編集アクションをキャンセルするかどうかを判断するアラートを表示する必要があると思います。

ユーザーに警告することで、ユーザーが誤ってボタンを押したのか、それともビューを離れることにしたのかを確認して、適切なアクションを取ることができます。

// add this to the field(s) to be edited, selector will be called as the changes
// are being made... still difficult to handle a cancel, but should work
[objectToEdit addTarget:self action:@selector(updateNameField:) 
                         forControlEvents:UIControlEventEditingChanged];

ここに追加のコード...

// the method called to update object from parent view
- (void)updateNameField:(id)sender {
    <OBJECT TO UPDATE>.text = ((UITextField *)sender).text;
}
于 2010-10-31T04:59:14.683 に答える