2012-05-01 43 views
6

Tôi có chế độ xem bảng trong đó các ô được tạo khác nhau tùy thuộc vào việc bảng có đang chỉnh sửa hay không. Cụ thể, kiểu chọn không có gì khi ở chế độ chỉnh sửa và màu lam khi không ở chế độ chỉnh sửa.Vẽ lại UITableViewCell khi vào/thoát chế độ chỉnh sửa

Khi tôi chuyển từ người này sang người khác, tôi nhận thấy rằng một số ô không được cập nhật. Một đoạn ghi nhật ký nhanh cho tôi biết rằng mặc dù sự xuất hiện của các tế bào thay đổi khá mạnh (ví dụ như các khung nhìn phụ kiện được thêm vào/gỡ bỏ một cách chính xác), chế độ xem bảng không làm mới kiểu lựa chọn (cũng không phải vấn đề của văn bản).

Điều gì đang xảy ra ở đây? Chỉ một số thuộc tính của ô được cập nhật khi setEditing được gọi? Có lẽ chỉ những người có phương pháp cụ thể cho phép phân bổ kiểu xem riêng biệt (ví dụ: EditingAccessoryType)? Tôi đoán tôi sẽ được hưởng lợi từ một EditingSelectionStyle.

Tôi nên giải quyết nó như thế nào? Bằng cách tùy chỉnh setEditing để thay đổi selectionStyle cho mỗi ô? Tôi thậm chí không chắc chắn làm thế nào tôi sẽ lặp qua xem bảng để làm điều này. reloadData không phải là một tùy chọn vì một số hoạt ảnh mà tôi đang sử dụng.

Trả lời

6

Tôi thấy rằng tùy chỉnh setEditing: để lặp qua các ô hiển thị và thiết lập selectionStyle cho mỗi hoạt động ok.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated{ 
    [super setEditing:editing animated:animated]; 

    for (UITableViewCell *cell in [self.tableView visibleCells]) { 
      NSIndexPath *path = [self.tableView indexPathForCell:cell]; 
      cell.selectionStyle = (self.editing && (path.row > 1 || path.section == 0)) ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleBlue; 
    } 
} 
+7

Tại sao bạn sẽ làm điều đó thay vì ghi đè setEditing: animated: on the cell? – jrturton

+0

Cảm ơn @jrturton, câu trả lời của bạn là thanh lịch hơn. – xialin

+0

@jrturton, bạn có thể thêm nhận xét của mình làm câu trả lời không? – phatmann

2

Nếu bạn nhìn vào UITableViewDelegate documentation, bạn sẽ thấy rằng có năm phương pháp để tùy chỉnh hành vi chỉnh sửa. Ngoài ra còn có phương pháp

- (BOOL)tableView:(UITableView *)tableView 
canEditRowAtIndexPath:(NSIndexPath *)indexPath 

trong UITableViewDataSource documentation sẽ được gọi trên mỗi ô trước khi bạn chuyển sang chế độ chỉnh sửa. Điều này cũng đúng cho

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView 
      editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 

sẽ được gọi cho tất cả các ô có thể chỉnh sửa. Nếu bạn muốn thay đổi cách các tế bào nhìn bạn có thể làm điều đó trong một trong hai. (Không thực hiện canEditRow.. giả định tất cả các hàng có thể chỉnh sửa.)


Cũng lưu ý rằng có thể có những cách khác để vào chế độ chỉnh sửa như trượt trên một tế bào, trong trường hợp này

   - (void)tableView:(UITableView *)tableView 
willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 

sẽ được gọi cho ô mà bạn đã vuốt lên:

Khi vào chế độ chỉnh sửa "vuốt để xóa" này, chế độ xem bảng sẽ gửi một bảngXem: messageBeginEditingRowAtIndexPath: thông báo cho người được ủy quyền để cho phép điều chỉnh s giao diện người dùng.

+0

Đây là thông tin hữu ích nhưng không thực sự giải quyết câu hỏi này. Tôi muốn biết nếu tôi cần phải tùy chỉnh setEditing: để lặp qua tất cả các visibleCells và thiết lập kiểu dáng lựa chọn, vì nó không được cập nhật tự động bởi setEditing: - câu trả lời là có, tôi làm. –

+0

Có, tuỳ chỉnh duy nhất xảy ra tự động cho bạn là contentView của tableViewCell được thay đổi kích thước khi các nút DeleteButton xuất hiện. Nếu bạn muốn tùy chỉnh bất cứ điều gì nhiều hơn thì bạn cần phải thực hiện một hoặc nhiều phương pháp này. –

+0

Mặc dù tôi nhận thấy rằng nhãn văn bản cũng được cập nhật tự động. –

0

này hoạt động trên Swift 2.3, chỉ cần ghi đè lên các phương pháp setEditing trong phân lớp tế bào tùy chỉnh của bạn:

class MyCell: UITableViewCell { 

    override func setEditing(editing: Bool, animated: Bool) { 
     super.setEditing(editing, animated: animated) 
     //Place your code here... 
    } 

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