Tôi chắc chắn đây là tài liệu của Apple hoặc phải được trả lời ở đâu đó trên diễn đàn này, vì nó có vẻ rất cơ bản, nhưng tôi không thể tìm thấy nó cũng không phải là một giải pháp đặc biệt thanh lịch.Lưu trữ nội dung UITextField trước khi xem pops
Những gì tôi có là một UIViewController đẩy chế độ xem chỉnh sửa trên ngăn điều hướng của nó. Chế độ xem chỉnh sửa có một loạt các UITextField trong đó. Nếu một trong số chúng đang được chỉnh sửa khi chạm vào nút quay lại, phương thức ViewWillAppear của chế độ xem ban đầu được gọi trước khi phương thức ủy nhiệm UITextField của textFieldShouldEndEditing
hoặc textFieldDidEndEditing
hoặc phương thức liên kết IB được gọi là textFieldEditingEnded
.
Dưới đây là một số mã mà tôi hy vọng sẽ làm cho nó rõ ràng hơn:
Trong 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];
}
Trong 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;
}
Nhật ký kết thúc với :
[...] Bước vào xem sẽ xuất hiện để xem tổng thể
[...] Chỉnh sửa các đối tượng
[...] Trong viewWillDisappear
[...] - Chúng tôi không điều khiển ngăn xếp .. . nút quay lại đã được đẩy
[...] Bước vào xem sẽ xuất hiện để xem tổng thể
[...] Trong textFieldShouldEndEditing
[...] Trong textFieldEditingEnded
[...] Trong textFieldDidEndEditing
Tôi muốn đặt self.editedObject.name = nameField.text
trước khi nhãn được đặt trong viewWillAppear
cho UIViewController.
Tôi đã nghĩ về phương thứcWillDisappear để kiểm tra EditViewController xem có trường nào trong số các trường văn bản của tôi hiện là người trả lời đầu tiên và nếu có văn bản và lưu trữ nó, nhưng điều này có vẻ giống như một kludge. để duy trì nếu tôi thêm hoặc thay đổi các trường văn bản.
Tôi cũng có thể thực hiện hành động liên kết textFieldEditingChanged
IB để đặt văn bản trong đối tượng đã chỉnh sửa sau mỗi lần gõ phím nhưng điều này cũng khá nhiều chi phí vì tôi phải tìm ra trường văn bản nào trong mọi phím tắt. chỉ hiển thị name
nhưng có một nhóm toàn bộ chúng).
Tất cả những gì tôi cần là chỉnh sửa được kết thúc hoặc để biết chỉnh sửa sẽ kết thúc trước khi viewWillAppear được gọi trong UIViewController để tênFieldLabel được đặt đúng.
Cảm ơn câu trả lời của bạn. Tôi tìm thấy nó cũng là câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/11319144/ios-xcode-crashed-after-typing-in-texts-in-uitextfield-and-go-back-nsisobject/ 11364617 # 11364617 – zekel
Cảm ơn bạn rất nhiều! Điều này khiến tôi phát điên. Trực giác, tôi muốn xem đây là hành vi mặc định. – guptron
Điều này không hoạt động đối với tôi, segue sẽ xảy ra trước 'viewWillDisappear': ( – RnMss