13

Trong tableview của tôi có các ô tùy chỉnh mà tôi khởi tạo từ một lớp UITableViewCell. Tôi có các phần cho các chữ cái đầu tiên của các bản ghi và có một indexPath đang được tạo động.Custom CellIdentifier là Null Khi sử dụng bộ điều khiển hiển thị tìm kiếm

Tôi muốn thêm bộ điều khiển hiển thị tìm kiếm vào chế độ xem bảng của mình. Vì vậy, tôi đã làm, tạo ra tất cả các phương pháp để lọc dữ liệu. Tôi chắc chắn rằng các chức năng của tôi đang hoạt động tốt bởi vì tôi đang in mảng đếm đến màn hình cho kết quả tìm kiếm.

Vấn đề của tôi là lượt xem lần đầu tiên tải, dữ liệu nằm trên màn hình. Nhưng khi tôi nhấn đầu vào tìm kiếm và nhập một chữ cái, hơn tôi nhận được lỗi 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'. Sau khi tôi sử dụng một breakpoint tôi thấy rằng tế bào tùy chỉnh của tôi là nil sau khi tìm kiếm. Dữ liệu tồn tại, nhưng ô không được khởi tạo.

Đây là mã tôi sử dụng để khởi tạo tế bào tùy chỉnh:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"ObjectCell"; 

    SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    NSDictionary *myObject = [[sections valueForKey:[[[sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 

    cell.label1.text = [myObject objectForKey:@"myValue"]; 
    return cell; 
} 

Tôi tin rằng tôi đã phạm sai lầm khi đặt điều khiển trong IB. Vì vậy, tôi đã thêm ảnh chụp màn hình của các đối tượng:

enter image description here

Connections thanh tra để xem bàn của tôi

Connections inspector for my table view

Connections thanh tra cho điều khiển hiển thị tìm kiếm của tôi

enter image description here

EDIT: Vấn đề thực sự được giải quyết, tôi đã sử dụng d a UISearchBar thay vì Search Display Controller nhưng tôi đoán vấn đề này vẫn chưa được giải quyết. Vì vậy, tôi sẵn sàng thử bất kỳ cách nào để làm cho nó hoạt động.

Trả lời

54

Tính đến đây search display controller question, bạn cần truy cập vào self.tableView thay vì tableView:

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

    // do your thing 

    return cell; 
} 
+1

Điều này có thể đã giải quyết được vấn đề, nhưng đối với hầu hết mọi người, vấn đề là họ không tạo ra một ô mới nếu không có trong hàng đợi cho UITableView đó. Các câu trả lời dưới đây phù hợp hơn giải thích cách xử lý này. – FilmJ

+0

Trên thực tế, kể từ ios6, nếu người dùng sử dụng bảng phân cảnh, ô sẽ luôn ở đó .. – nikravi

0

Tôi không chắc chắn về cách tính năng này sẽ hoạt động trong lưu trữ.

Nhưng thông thường bạn sẽ kiểm tra xem [tableView dequeueReusableCellWithIdentifier:CellIdentifier] có trả về một ô hay không. Bởi vì nếu các tế bào trong không nạp trước hoặc không có bất kỳ tế bào để tái sử dụng bạn sẽ phải tạo ra một tế bào mới:

SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[SpeakerCell alloc] initWithIdentifier: CellIdentifier]; 
} 

Ngoài ra khi thực hiện kê khai biến cục bộ trong Objective-C chúng ta lều không hoa chữ cái đầu tiên.

+0

Không hiển thị @interface cho 'SpeakerCell' khai báo bộ chọn 'initWithIdentifier:'? – kubilay

+0

Bạn đã thiết lập ô như là một 'nib'? Sau đó, bạn sẽ phải nạp 'nib' khác mà bạn có thể tạo ra methode' initWithIdentifier' và thiết lập ô trong phương thức này. – rckoenes

+0

Tôi không sử dụng bất kỳ nib, tôi đang sử dụng một lớp UITableViewCell và khai báo định danh ô trong tableview. Phương thức initWithIdentifier nên chứa gì? trở về bản thân? bằng cách này tại sao không viết hoa chữ cái đầu tiên trong Objective-C? Hầu hết các ví dụ có chứa như vậy, không biết rằng nó đã sai. – kubilay

2

Đối với những người sử dụng iOS 5 và kịch bản, bạn sẽ muốn sử dụng các phương pháp sau đây thay vì initWithIdentifier:

initWithStyle: (UITableViewCellStyle) stylereuseIdentifier: (NSString *) reuseIdentifier

Ví dụ:

NSString *cellIdentifier = @"ListItemCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 
0

tôi đã cùng một vấn đề, với các tế bào tùy chỉnh (được xây dựng trong Storyboard) không được rút ra càng sớm càng chữ cái đầu tiên được đưa vào trường tìm kiếm. Tuy nhiên, tìm kiếm thành công.

Cuối cùng tôi tìm thấy một good tutorial from Brenna Blackwell đề xuất định cấu hình thủ công ô vẽ trong lớp con tương ứng của UITableViewCell, thêm UILabels và các mục khác.

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