2009-12-29 43 views
18

Tôi đang cố gắng điền vào một uitableview với nhiều phần. Đây là mã của tôi:Các vấn đề về UITableView với cellForRowAtIndexPath

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

case 1: 
[[cell textLabel] setText:[usersTeachers objectAtIndex:(indexPath.row+1)]]; 
return cell; 
break; 

tôi nhận được lỗi này khi tôi cố gắng để tải quan điểm:

2009-12-28 21:09:48.380 FSS[2046:207] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit/UIKit-984.38/UITableView.m:4709 
2009-12-28 21:09:48.381 FSS[2046:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 

Mảng ở đó các bản ghi chỉ số như là một chuỗi hợp pháp nhưng nó không trở lại phòng giam đúng . Do đó, nó không tải quá điểm này. Hãy giúp tôi.

Trả lời

2

Không chắc chắn lý do tại sao bạn có "trường hợp 1:" ngồi ở đó một mình, nhưng nếu đó là trường hợp KHÁC hơn 1, điều này sẽ giảm, và bất kỳ điều gì đến sau này sẽ được trả lại. Hãy chắc chắn rằng bạn luôn luôn trả lại một tế bào.

+0

Tôi hiểu. Tôi đã thiết lập toàn bộ câu lệnh chuyển đổi. Tôi chỉ sử dụng đầu tiên để đưa ra một ví dụ về những gì đang xảy ra. Nó không chạy một trường hợp khác trước khi nó đưa ra lỗi. –

2

Có thể bạn không trả lại ô cho indexPath.row == 0 (trường hợp 1 của bạn là đáng ngờ ...). Nhưng không thể nói trừ khi bạn đăng toàn bộ câu lệnh chuyển đổi của mình.

Thử trả về 'ô' bên ngoài câu lệnh chuyển đổi của bạn, bạn sẽ hiểu rõ hơn điều gì sẽ xảy ra. Bạn sẽ không có một xác nhận thất bại sau đó.

28

Dường như với tôi rằng bạn có trường hợp chuyển đổi có thể nhìn thấy một phần khi nó trả lại ô cho trường hợp 1. Lỗi của bạn khiến tôi nghĩ rằng bạn đang trả lại một số chi nhánh trong trường hợp chuyển đổi.

Đảm bảo tất cả các đường dẫn ra khỏi hộp công tắc đó trả lại đối tượng UITableViewCell hợp lệ.

Bạn quay lại trường hợp nào 0? Nói cách khác, bạn đang quay trở lại hàng đầu tiên mà UITableView yêu cầu là gì?

Đây là một mẫu mã từ một trong những dự án của tôi, Nó có thể cung cấp cho bạn một điểm khởi đầu tốt đẹp để xem nơi bạn đang đi sai:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    NSInteger section = [indexPath section]; 

    switch (section) { 
     case 0: // First cell in section 1 
      cell.textLabel.text = [collectionHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 1: // Second cell in section 1 
      cell.textLabel.text = [noteHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 2: // Third cell in section 1 
      cell.textLabel.text = [checklistHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     case 3: // Fourth cell in section 1 
      cell.textLabel.text = [photoHelpTitles objectAtIndex:[indexPath row]]; 
      break; 
     default: 
      // Do something else here if a cell other than 1,2,3 or 4 is requested 
      break; 
    } 
    return cell; 
} 
+2

+1 Như bạn nói, gần như chắc chắn mã bị thiếu mặc định: trường hợp hoặc là nếu không trở về nil trên một số đường dẫn mã. –

+0

hãy giúp tôi hiểu tại sao chúng tôi đưa ra nếu (cell == nil) nếu (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] autorelease]; } Vì nếu ô == nil hoặc nếu (! Ô), nó sẽ không bao giờ đi vào điều kiện để tạo ô. –

+0

Nếu tôi có 1000 giá trị đến từ cơ sở dữ liệu thì trong trường hợp này tôi có phải viết 1000 trường hợp không ?? –

2

Kiểm tra bạn có

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

trong

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
2

Ok, nếu tất cả các giải pháp khác cho câu hỏi này không hoạt động, hãy đảm bảo rằng Mã nhận dạng di động cho tế bào quan điểm của bảng (trong kịch bản) phù hợp với nhận dạng tế bào mà bạn sử dụng trong mã tableviewdelegate của bạn:

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

Từ định tế bào trong kịch bản của bạn phải "CustomCell" để phù hợp với mã này.

-3

Trong trường hợp của tôi, tôi đã có lỗi tương tự, vì tôi đã thiếu alloc/init:

if (cell == nil) { 
     cell = [[UITableViewCell alloc] init]; 

} 
+0

Nếu bạn nhìn vào mã trong câu hỏi, anh ta đang thực hiện phân bổ nhưng sử dụng trình khởi tạo cụ thể hơn. – Abizern

+0

Điều này sẽ không hoạt động như bạn muốn, @Abizern là chính xác. –

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