2011-11-21 29 views
6

Tôi có một UITable chứa một số UITableCells hải quan. Các ô này chứa một vài UILabels và UITextField. Nguồn dữ liệu của bảng đến từ thuộc tính của bộ điều khiển chính. (Bộ điều khiển này cũng là đại biểu và dataSource cho bảng).Tải lại một UITable khi đang di chuyển khi chỉnh sửa một UITextField bên trong một trong các ô

Dưới đây là một ảnh chụp màn hình đơn giản của giao diện người dùng:

schreenshot

Bây giờ, tôi cần phải cập nhật "on the fly" nội dung của tất cả các UILabels khi người dùng chỉnh sửa một trong những UITextFields. Để làm như vậy, tại tôi đang nghe sự kiện "Chỉnh sửa đã thay đổi" ở cấp UITextField. Điều này dẫn tới những hành động sau đây:

- (IBAction) editChangeHandler: (id) sender { 
    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    [[delegate.viewController.myDataSourceArray objectAtIndex:self.rowIndex] setANumber: [theTextField.text intValue]]; 
    [delegate.viewController reloadRows]; 
} 

Phương pháp reloadRows trong viewController là như vậy:

- (void) reloadRows { 
    NSLog(@"called reloadRows"); 
    //perform some calculations on the data source objects here... 
    [theUITable reloadData]; 
} 

Vấn đề của tôi ở đây là bất cứ khi nào người dùng thay đổi giá trị trong lĩnh vực này, phương pháp reloadRows là thành công được gọi, có vẻ như reloadData nhưng nó cũng khiến bàn phím bị loại bỏ.

Vì vậy, cuối cùng, người dùng chỉ có thể chạm vào một phím khi chỉnh sửa TextField trước khi bàn phím bị loại bỏ và bảng được tải lại.

Có ai biết giải pháp cho vấn đề này hoặc đã gặp phải vấn đề tương tự không?

Trả lời

3

Bạn có thể sửa đổi có chọn lọc các hàng nếu cần, thay vì cập nhật toàn bộ bảng (thực hiện việc này đang cập nhật ô bạn hiện đang làm việc, đặt lại trạng thái của nó).

Nhìn vào:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

Ngoài ra, bạn có thể chỉnh sửa những tế bào trực tiếp bằng cách lấy tế bào qua:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath 

nếu bạn không muốn phải xây dựng lại những tế bào.

+0

Arf! Cảm ơn bạn ! Việc loại bỏ bàn phím thực sự được giải thích bằng cách thiết lập lại trạng thái ô. Làm thế nào tôi có thể không thấy điều đó?:-) Kể từ khi tôi cần các nhãn của hàng hiện tại được cập nhật là tốt, tôi đã kết thúc theo đề nghị thứ hai của bạn và đã viết một phương pháp mới trong bộ điều khiển mà chỉ cập nhật nhãn của các hàng riêng lẻ. – Saze

3

Tôi đã gặp phải sự cố tương tự. Trong trường hợp của tôi, tôi đã cố gắng để tạo ra một bộ điều khiển chung, do đó, viết một phương pháp cụ thể để tự xây dựng lại các tế bào không phải là một lựa chọn tốt.

Dưới đây là giải pháp tôi đến với:

  1. Tạm thời làm cho một trường văn bản trong một số tế bào khác trong bảng trở thành responder đầu tiên.
  2. Gọi lạiRowsAtIndexPaths để tải lại ô mà người dùng của bạn đang chỉnh sửa.
  3. Đặt trường mà người dùng đang chỉnh sửa trở thành trả lời đầu tiên lần nữa.

Nó hoạt động như một sự quyến rũ. Bàn phím vẫn hiển thị mà không nhấp nháy, ô được làm mới đúng cách và người dùng có thể tiếp tục nhập vào cùng một trường mà ban đầu họ đang chỉnh sửa.

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