2012-01-21 37 views
5

Tôi gặp sự cố với phương thức reloadData của UITableView. Tôi đã tìm thấy rằng nó chỉ gọi cellForRowAtIndexPath nếu có các tế bào mới được thêm vào hoặc lấy đi.Force UITableView để gọi cellForRowAtIndexPath: cho tất cả các ô

Ví dụ: Tôi có năm ô, mỗi ô có năm chuỗi. Nếu tôi thêm một ô mới và gọi số reloadData, bảng sẽ được cập nhật và tôi sẽ thấy nó. Tuy nhiên, nếu tôi đi vào một trong năm ô, thêm một chuỗi mới, sau đó trở về và gọi reloadData, không có phương thức ủy nhiệm nào của chế độ xem bảng được gọi.

Câu hỏi của tôi: Có thể bắt buộc xem bảng để tải lại hoàn toàn dữ liệu trong tất cả các ô hiển thị của nó không?

Trả lời

8

Tôi đã tìm thấy sự cố- Tôi đã có mã tùy chỉnh ô trong khối if(cell == nil), vì các ô đã được tái chế nên chúng không bị thay đổi. Lấy mã tùy chỉnh của tôi ra khỏi khối đó đã khắc phục được sự cố.

+0

Bạn đã tiết kiệm được số giờ nỗ lực của mình. Cảm ơn bạn! Tôi sẽ không đoán sai lầm ngu ngốc này :) – Pruthvid

+0

Vui vì giải pháp của tôi có thể giúp người khác! –

0

Vâng, chế độ xem bảng sẽ gọi cellForRowAtIndexPath trên các ô hiển thị nhưng nếu bạn gọi reloadData, nó sẽ làm điều đó để có điều gì khác xảy ra ở đây và tôi không chắc nó là gì.

+0

Trong trường hợp này, tất cả các ô đều hiển thị. Tôi biết rằng nguồn dữ liệu (trong ví dụ này, NSUserDefaults) đang được cập nhật, vì vậy tôi không chắc chắn chính xác tại sao chỉ các ô mới đang được cập nhật. –

+0

Bạn đã theo dõi các cuộc gọi đến 'cellForRowAtIndexPath' để chứng minh nó không được gọi hay bạn chỉ không nhìn thấy một sự thay đổi trực quan? Nếu 'cellForRowAtIndexPath' không được gọi ... Tôi không biết chuyện gì đang diễn ra. Tại thời điểm đó, tôi sẽ đi một bước trở lại và theo dõi các cuộc gọi đến 'numberOfRowsInSection'. Trong mọi trường hợp, tôi có thể nói rằng 'cellForRowAtIndexPath' _should_ được gọi cho mọi ô hiển thị khi bạn thực hiện' reloadData'. – smparkes

+0

NSLogs nói rằng khi tôi thêm một hàng mới, mọi thứ sẽ được cập nhật; giả thuyết ban đầu của tôi là sai. Khi gọi reloadData khi trở về chế độ xem bảng từ một trình điều khiển chế độ xem khác, không có gì được gọi. –

0

Ngay cả khi chế độ xem bảng của bạn có 50 hàng, chỉ có một số ô có thể hiển thị cùng một lúc. Đó là toàn bộ câu chuyện đằng sau reuseIdentifier. Vì vậy, buộc 'tất cả các tế bào' không tồn tại. Nếu một ô mới xuất hiện, dữ liệu được tải động.

Cách duy nhất để thay đổi ô là thay đổi dữ liệu được phân phối bởi phương thức dataSource cellForRowAtIndexPath.

+1

Tôi bỏ lỡ câu hỏi của mình; Tôi đã cập nhật nó. –

+0

Và nếu bạn thử 'reloadRowsAtIndexPaths: withRowAnimation:' Chỉ cần kiểm tra ... Không để đây là giải pháp. – Jodocus

+0

Điều đó cũng không hoạt động; nó không có hiệu lực. –

0

Không lấy mã của bạn ra khỏi khối if (cell == nil). Thay vào đó, hãy tạo một mã định danh đại diện cho ô bạn đang tạo; hãy thử và đảm bảo rằng tất cả nội dung của ô được đề cập trong số nhận dạng. Ví dụ: nếu bạn có 3 số hiển thị, hãy đảm bảo có ba số đó trong số nhận dạng theo cách duy nhất sẽ chỉ tham chiếu đến ô có nội dung như vậy.

Giả sử bạn có ba thuộc tính NSArray trong lớp, array1, array2 và array3 có các giá trị int được bao bọc bên trong các đối tượng NSNumber. Bạn muốn sử dụng những NSArrays đó để điền vào một UITableView, đây là những gì tôi muốn làm:

- (UITableViewCell *)tableView:(UITableView *)tableView 
        cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *identifier = [NSString stringWithFormat:@"%@-%@-%@", 
          [[array1 objectAtIndex:indexPath.row] intValue], 
          [[array2 objectAtIndex:indexPath.row] intValue], 
          [[array3 objectAtIndex:indexPath.row] intValue]]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] 
            initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:identifier] autorelease]; 

     //Build your cell here. 
    } 

    return cell; 
} 
1

Tôi đã tìm thấy rằng các phần tải lại tải lại dữ liệu dễ dàng hơn. Nếu bạn chỉ có một phần bạn có thể thử:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

1

Bạn có thể thử này

[tableView reloadData]; 

hoặc

[tableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]; 

đặt này trong commitEditingStyle phương pháp.

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