2010-10-31 38 views
13

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.

Trả lời

17

OK, tôi đã tìm ra một giải pháp đơn giản sau khi rất nhiều lướt web, diễn đàn đọc, và hướng dẫn đọc. Đó là, như tôi nghi ngờ, rất đơn giản, chỉ có một dòng mã được thêm vào. Trong phương pháp viewWillDisappear của EditViewContorller tôi chỉ đơn giản nói thêm:

[self.view.window endEditing: YES]; 

Bây giờ textFieldShouldEndEditing, textFieldEditingEnded, và textFieldDidEndEditing tất cả bị sa thải khỏi trước khi viewWillAppear của cái nhìn tổng thể thực hiện.

Vì vậy, bây giờ là phương pháp viewWillDisappear trông giống như:

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

Và các phương pháp đã được áp dụng để xử lý các 'Return' trên bàn phím cũng xử lý các nút 'Quay lại' trên bộ điều khiển Navigation.

Cảm ơn bạn Aaron và Jeff đã hỗ trợ và giúp tôi suy nghĩ điều này.

+0

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

+0

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

+0

Điều này không hoạt động đối với tôi, segue sẽ xảy ra trước 'viewWillDisappear': ( – RnMss

0

Tại sao không chỉ tạo nút Quay lại của riêng bạn với logic đó trong phương thức hành động của nó?

+0

Cảm ơn đề xuất Jeff. Đây có thể là những gì tôi cần làm nhưng tôi mất giao diện người dùng xuất hiện của nút bằng đầu nhọn, trừ khi tôi thực hiện nhiều công việc tạo nút tùy chỉnh bằng cách tạo tệp PNG cho nó, v.v., tôi tôi sẵn sàng làm điều đó nếu tôi phải làm, để có được chức năng, nhưng tôi hy vọng về điều gì đó tôi thiếu để chỉ thêm vào mã của tôi. – LavaSlider

-1

Tôi nghĩ rằng từ góc độ UX, bạn sẽ hiển thị cảnh báo để xác định xem người dùng có muốn hủy tác vụ chỉnh sửa mà họ đang ở giữa trước khi thoát khỏi chế độ xem hiện tại hay không.

Bằng cách cảnh báo cho người dùng, bạn có thể biết liệu họ có vô tình nhấn nút hay không hoặc nếu họ đã quyết định rời khỏi chế độ xem, hãy thực hiện hành động thích hợp.

// 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]; 

mã bổ sung ở đây ...

// the method called to update object from parent view 
- (void)updateNameField:(id)sender { 
    <OBJECT TO UPDATE>.text = ((UITextField *)sender).text; 
} 
+0

Tôi sẽ ổn với điều đó. Tôi đã thực sự nghĩ rằng nó sẽ là một nút trở lại có chủ ý ... tại sao phải nhấn Done sau đó trở lại? Tôi cho rằng yêu cầu đó ngăn cản tình cờ "Back" s. Nhưng điều này không cung cấp bất kỳ sự trợ giúp nào vì tôi không có cách nào để biết liệu có nên trình bày cảnh báo vì tôi không biết điều gì hoặc nếu một trường văn bản đang trong quá trình chỉnh sửa. – LavaSlider

+0

@LavaSlider xem các chỉnh sửa, để làm điều gì đó như textFieldEditingChanged bạn đang thảo luận –

+0

@LavaSlider không quá khó để thực hiện một cái gì đó như textFieldEditingChanged. Xem các chỉnh sửa ở trên cho giải pháp –

Các vấn đề liên quan