2012-04-03 3 views
8

Tôi đang sử dụng tùy chỉnh UITableViewCell. Khi tôi cố gắng chạy mã của tôi, tôi đã ngoại lệ stack này và tôi không thể hiểu được nguồn gốc của vấn đề:Nib không hợp lệ đã đăng ký cho số nhận dạng ((null)) - nib phải chứa chính xác một cấp cao nhất

terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier ((null)) - nib must contain exactly one top level object which must be a UITableViewCell instance' 

Xin lưu ý Tôi không sử dụng Bảng phân cảnh.

EDIT:

Đây là mã có liên quan của tôi mà gây ra vấn đề theo breakpoint:

[tableviewSupport registerNib:[UINib nibWithNibName:@"HotelCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:CustomCellCId]; 
+0

Tôi khuyên bạn nên chia dòng mã đó thành hai cho mục đích gỡ lỗi. Nạp đối tượng UINib vào một biến và kiểm tra xem thành công đó có thành công hay không trước khi thử đăng ký nó. –

Trả lời

1

Tôi không hoàn toàn chắc chắn những gì bạn đang cố gắng để làm trong mã được cung cấp của bạn. Bạn sẽ dỡ bỏ ngòi của bạn trong tableView: cellForRowAtIndexPath :. Bạn có thể sử dụng mã bên dưới:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Assuming you set a reuse identifier "cellId" in the nib for your table view cell... 
    HotelCell *cell = (HotelCell *)[tableView dequeueReusableCellWithIdentifier:@"cellId"]; 
    if (!cell) { 
     // If you didn't get a valid cell reference back, unload a cell from the nib 
     NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"HotelCell" owner:nil options:nil]; 
     for (id obj in nibArray) { 
      if ([obj isMemberOfClass:[HotelCell class]]) { 
       // Assign cell to obj 
       cell = (HotelCell *)obj; 
       break; 
      } 
     } 
    } 

    return cell; 
} 

Bây giờ, dựa trên lỗi bạn đã đăng, iOS có thể là một đối tượng trong mảng nên vòng lặp for có thể không cần thiết. Tôi đã thực hiện điều này bằng cách kiểm tra xem [nibArray count] == ​​1 và sau đó lấy đối tượngAtIndex: 0 và gán nó vào ô thay vì lặp, và điều này cũng hoạt động. Nhưng, nếu một ngày nào đó Apple quyết định gắn bó thứ gì đó khác vào nibArray đó, một vòng lặp for bảo vệ bạn khỏi điều đó.

+0

nếu bạn sử dụng IOS6, hãy thử dequeueReusableCellWithIdentifier: forIndexPath: và vui vẻ. để xác minh xem ô có phải không còn cần thiết – seufagner

0

Đây có thể không phải là câu trả lời cho câu hỏi của OP, nhưng tôi đã gặp lỗi tương tự với giải pháp khác, vì vậy tôi sẽ trả lời câu hỏi này vì lợi ích của nhân viên Google đến sau đây.

I đã làm có một đơn UITableViewCell (thực sự là lớp con của riêng tôi) trong XIB của tôi - vì vậy tôi không thể hiểu tại sao nó không hoạt động.

Mấu chốt có vẻ là:

Khi bạn đã tạo một tệp XIB với một đơn UITableViewCell hoặc lớp con (ví dụ như nếu bạn kéo vào một UITableViewCell từ thư viện trên phía dưới bên phải), Interface Builder cho bạn thấy một trong phần "Bảng Xem ô" của tab Thanh tra.

Tôi thường được sử dụng để tạo UIView và thay đổi loại của nó thành lớp con UITableViewCell của tôi, vì vậy tôi chưa bao giờ nhận thấy tùy chọn đó.

Đó là mà bạn cần phải gõ các định danh (cũng như trong registerNib:withReuseIdentifer: cuộc gọi của bạn).

Bực bội hơn cho tôi khi gặp phải điều này là nó không bị lỗi EVERY lần, chỉ lần đầu tiên. Kỳ dị.

29

Một giải pháp:

tôi đã UITableViewCell, nhưng trong XIB của tôi đã có một đối tượng thêm, một nhãn mà tôi đã đặt không đúng chỗ.

Vì vậy, hãy kiểm tra XIB của bạn cẩn thận để đảm bảo chỉ có một đối tượng trong bảng đối tượng ở bên trái.

enter image description here

+0

không, tôi đã có một Nút chỉ ngồi đó –

+0

Cảm ơn bạn, câu trả lời này chỉ chấm dứt khoảng ba giờ gỡ lỗi dường như vô vọng. Tôi nghĩ rằng tôi đã xóa chế độ xem mặc định từ tệp mà IB tạo ra, nhưng hóa ra tôi đã chỉ ẩn nó. –

+1

wow. Đây là một ví dụ điển hình về cách một thứ đơn giản có thể giúp bạn tiết kiệm thời gian gỡ lỗi. Cảm ơn bạn. – holydevil

0

Trong trường hợp của tôi, tôi thiết lập một tài sản với lớp tên (cho ví dụ: @property (mạnh, nonatomic) IBOutlet UILabel * lớp) trong tableviewcell, điều này cung cấp cho trên lỗi đề cập, sau đó đặt tên "class" là không phải kiểu mục tiêu c, thay đổi (class = classabc) giải quyết vấn đề trên.