これはAppleのドキュメントにあると確信しているか、このフォーラムのどこかで回答されているに違いありません.
私が持っているのは、ナビゲーション スタックに編集ビューをプッシュする UIViewController です。編集ビューには、多数の UITextFields があります。textFieldShouldEndEditing
戻るボタンがタッチされたときにそれらの 1 つが編集中の場合、 または の UITextField デリゲート メソッド、またはtextFieldDidEndEditing
IB リンク アクションメソッドが呼び出される前に、元のビューの 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 が適切に設定されます。