2011-12-02 4 views
5

Đây là mã tóm tắt cho cellForRowAtIndexPath phương pháp UITableView đại biểu của tôi:UITableView indexPath phần luận lý

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"]; 
if (cell == nil) { 
    // No cell to reuse => create a new one 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"blahblahblah"] autorelease]; 
} 
cell.textLabel.text = @""; 
cell.detailTextLabel.text = @""; 
cell.backgroundView = NULL; //problem here 

// Initialize cell 
//blah blah blah 
//now to the good part... 

if(indexPath.section == 1) { 
    cell.backgroundView = deleteButton; 
    cell.userInteractionEnabled = YES; 
    cell.textLabel.text = nil; 
    cell.detailTextLabel.text = nil; 
} 

else if(indexPath.section == 0) { 
    NSLog(@"section: %i row: %i", indexPath.section, indexPath.row); 
    switch (indexPath.row) { 
     case 0: 
      cell.textLabel.text = @"foobar"; 
      //more stuff 
      break; 

     //lots more cases 

     default: 
      break; 
    } 
} 

return cell; 

}

Vấn đề của tôi là ô đầu tiên trong phần 1 (phần 0 có 10 tế bào, phần 1 chỉ có 1 ô) được gán thông tin chỉ được gán cho ô 0 của phần đầu tiên. Vì vậy, thay vì nhận được nền deleteButton và vv, nó nhận được tiêu đề nhãn "foobar". Tôi không thực sự chắc chắn tại sao điều này xảy ra, bởi vì các câu lệnh if của tôi khá rõ ràng. Ý tưởng nào?

Chỉnh sửa: đặt backgroundView thành NULL làm cho các ô đó có văn bản, khi chúng rời khỏi chế độ xem, quay lại mà không có bất kỳ nền nào. Vì vậy, đó không phải là một giải pháp khả thi. Ngoài ra, văn bản cho detailTextLabel vẫn được đặt trên ô không có bất kỳ văn bản nào.

Đây là cách hiển thị, với backgroundViews di động thiết lập để nil và văn bản hiển thị trên các tế bào xóa nơi mà nó không nên:

enter image description here

Giải pháp, theo khuyến cáo của Alex Deem (thay thế mã dequeue cũ với mã này):

NSString* identifier; 
if(indexPath.section == 0) 
    identifier = @"0"; 
else 
    identifier = @"1"; 
UISwitch *switchView; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
if (cell == nil) { 
    // No cell to reuse => create a new one 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease]; 

Trả lời

5

Bạn nên đọc tài liệu về việc sử dụng lại ô.

Bạn nên sử dụng một reuseIdentifier khác cho từng phần trong số hai phần vì chúng là các ô có kiểu dáng cơ bản khác nhau.

+0

Ah, vâng, điều đó đã làm được. Đã cập nhật câu hỏi bằng giải pháp. –

0

thêm một khung bế mạc } những dòng mã:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"]; 
if (cell == nil) { 
    // No cell to reuse => create a new one 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"blahblahblah"] autorelease]; 
} 
.... 
.... 
.... 
if(indexPath.section == 1) { 
    .... 
    .... 
} 
if(indexPath.section == 0) { 
    .... 
    .... 
} 

và tôi nghi ngờ bạn sẽ có kết quả tốt hơn trong bảng của mình.

Cách thức mọi thứ đang hoạt động ngay bây giờ (ít nhất là theo như tôi có thể nói trong mã của bạn), bạn tạo một ô và nó được khởi tạo thành một thứ gì đó. Nó không bao giờ được đặt lại về giá trị & dữ liệu của bất kỳ thứ gì khác đang được yêu cầu.

+0

Điều đó đã không thực hiện - bây giờ cả hai ô ở hàng 0 trong phần của chúng đều nhận * cả * văn bản từ ô trong phần 0 và nền từ ô trong phần 1. Nhưng nó đã làm gì, khi tôi phát hiện ra tai nạn, đang sử dụng các định danh khác nhau cho dequeueReusableCellWithIndentifier và reuseIndentifier ... Đây có phải là một thực tế không tốt? –

+0

cập nhật câu hỏi ban đầu của bạn với mã mới ... và có, số nhận dạng phải giống nhau trong một chế độ xem bảng. –

+0

Tôi đã cập nhật câu hỏi với mã mới –

0

Mã của bạn có cấu trúc sai.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"]; 
if (cell == nil) 

dqueueReuseableCellWithIdentifier sẽ trả lại ô đã tạo trước đó nếu không còn sử dụng. If cell == nil bạn nên tạo một ô mới và đặt mặc định chung cho tất cả các ô. Tuy nhiên, bất kỳ cài đặt dữ liệu nào duy nhất cho indexPath đó phải được thực hiện sau

if(cell==nil) block. 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"]; 
if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1   reuseIdentifier:@"blahblahblah"] autorelease]; 
} 
[email protected]"unique text"; 
return cell; 
+0

Vui lòng xem nhận xét tôi đã đăng trên câu trả lời của Micheal Dautermann. –