20

Tôi có thiết lập UIViewController trong bảng phân cảnh có tableviewUISearchDisplayController.Tai nạn tế bào nguyên mẫu UISearchDisplayController và UITableView

Tôi đang cố gắng sử dụng ô mẫu thử tùy chỉnh từ self.tableview (được kết nối với chế độ xem bảng chính trong bảng phân cảnh). Nó hoạt động tốt nếu self.tableview đã trả lại ít nhất 1 ô khi tôi tải chế độ xem của tôi, nhưng nếu self.tableview không tải ô (vì không có dữ liệu) và tôi tải lên UISearchBar và tìm kiếm, phương pháp cellForRowAtIndexPath: lỗi:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomSearchCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath]; 

    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 

-(void)configureCell:(CustomSearchCell *)cell atIndexPath:(NSIndexPath *)indexPath { 
    User *user = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

    cell.nameLabel.text = user.username; 
} 

lỗi:

*** Assertion failure in -[UITableViewRowData rectForRow:inSection:heightCanBeGuessed:] 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for rect at invalid index path (<NSIndexPath: 0x9ef3d00> {length = 2, path = 0 - 0}) 

My fetchedResultsController dường như có dữ liệu (1 phần, 2 hàng) tại thời điểm các phương pháp trên được gọi. Nó treo trên dòng dequeueReusableCellWithIdentifier.

Bất kỳ con trỏ/ý tưởng nào? Nó nên dequeue các tế bào nguyên mẫu từ self.tableview, nhưng tôi đoán là không có ai được tạo ra trong self.tableview vì vậy đây là nguyên nhân?

+0

Bạn có thể đăng mã của phương thức 'configureCell: atIndexPath:' không?Vấn đề có thể là ở đó –

+0

nó bị treo trước khi nó đến đó ... Tôi sẽ thêm nó mặc dù – mootymoots

+0

thêm ở trên ... không thực sự làm nhiều – mootymoots

Trả lời

-1

Nếu bạn sử dụng à UISearchDisplayController trong celodeRowAtIndexPath, bạn phải sử dụng tham số tableView methode và không phải là con trỏ giữ của bộ điều khiển.

thử với mã này

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath]; 
+3

CustomSearchCộ nhận diện không tồn tại trên ô UISearchDisplayController. Đó là một tế bào nguyên mẫu trên bảng nhìn ban đầu trong bảng phân cảnh. Bạn không thể thêm một ô mẫu để UISearchDisplayController trong bảng phân cảnh ... AFAIK – mootymoots

7

tôi giải quyết điều này bằng cách nhân đôi tế bào nguyên mẫu vào một xib mới:

Trong viewDidLoad:

[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"CustomSearchCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CustomSearchCell"]; 

Và cập nhật cellForRowAtIndexPath sử dụng tableview của phương pháp không phải là self.tableview gốc:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath]; 

    [self configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 
60

UISearchDisplayController quản lý UITableView riêng của nó (bảng được lọc), ngoài việc có bảng chính của bạn. Số nhận dạng ô trong bảng được lọc không khớp với bảng chính của bạn. Bạn cũng muốn lấy các tế bào không phải bởi indexPath như cả hai bảng có thể rất khác nhau từ mỗi khác liên quan đến số hàng với vv

Vì vậy, thay vì làm điều này:

UITableViewCell *cell = 
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier 
forIndexPath:indexPath]; 

thay vì làm điều này:

UITableViewCell *cell = 
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
+3

Tôi đã đấu tranh cho một 2 giờ tốt về điều này. Phản hồi của bạn đã giúp rất nhiều, đặc biệt là lưu ý của bạn rằng bạn bỏ qua forIndexPath vì các bảng có thể có các chỉ mục khác nhau rất nhiều. Ngoài ra, đối với các độc giả khác: hãy đảm bảo rằng bạn có self.tableview không chỉ là xem bảng. – ThinkBonobo

+0

Tuyệt vời. Làm cho ngày của tôi. –

+1

Xin Chúa ban phước cho bạn – shannoga

0

Đây là một chủ đề cũ, nhưng nếu có ai chạy vào cùng một vấn đề vẫn còn, đối với tôi nó có liên quan đến việc có dòng này trong viewDidLoad

self.tableView.estimatedRowHeight = 80; 

và đồng thời thực hiện các phương pháp đại biểu heightForRowAtIndexPath với chiều cao biến trong điều kiện khác nhau

if (indexPath.row == 0) { 
    return 44 + cellTopSpacing; 
} else { 
    return 44; 
} 

Loại bỏ các chiều cao hàng ước tính giải quyết nó.