質問

これはAppleのドキュメントにあるか、このフォーラムのどこかで答えられたに違いないと確信しています。なぜなら、それはとても基本的だと思われるからです。

私が持っているのは、ナビゲーションスタックの編集ビューをプッシュするuiviewcontrollerです。編集ビューには、uitextfieldsがたくさんあります。そのうちの1つがバックボタンに触れているときに編集中の場合、元のビューのViewWillAppearメソッドは、のUITEXTFIELDデリゲートメソッドの前に呼び出されます。 textFieldShouldEndEditing また textFieldDidEndEditing, 、またはIBリンクされたアクション 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でu003CUITextFieldDelegate>:

- (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;
}

ログは次のとおりです。

...]入力ビューはマスタービューに表示されます
...]オブジェクトの編集
...] viewwilldisapear
...] - コントローラースタックにはありません...バックボタンが押されました
...]入力ビューはマスタービューに表示されます
...] TextFieldShouldinditingで
...] TextFieldEditingEddで
...] TextFieldDidenditingで

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

editViewControllerのviewwilldisappearメソッドで考えました。私のテキストフィールドのいずれかが現在最初のレスポンダーであるかどうかを確認するためにチェックします。テキストフィールドを追加または変更します。

私も実装することができます textFieldEditingChanged すべてのキーストロークの後に編集されたオブジェクトにテキストを設定するためのIBリンク化されたアクションは、すべてのキーストロークにあるテキストフィールドを把握する必要があるため、これはかなりの間接的です(私は示したことを覚えておいてください name しかし、それらの束があります)。

必要なのは、編集が終了するか、編集が終了することを知ることだけです。willappearがuiviewcontrollerで呼び出されるため、namefieldlabelが適切に設定されます。

役に立ちましたか?

解決

OK、多くのWebサーフィン、フォーラムの読書、手動の読書の後、簡単なソリューションを見つけました。私が疑ったように、非常に単純で、コードの1行しか追加されていませんでした。の中に viewWillDisappear editviewcontorllerの方法私は簡単に追加しました:

    [self.view.window endEditing: YES];

textFieldShouldEndEditing, textFieldEditingEnded, 、 と 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];
}

また、キーボードの「返品」を処理するために既に整備されている方法は、ナビゲーションコントローラーの「バック」ボタンも処理します。

アーロンとジェフ、あなたの援助と私がこれを通して考えるのを手伝ってくれてありがとう。

他のヒント

アクション方法でそのロジックを使用して、独自のバックボタンを作成してみませんか?

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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top