Đâ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:
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];
Ah, vâng, điều đó đã làm được. Đã cập nhật câu hỏi bằng giải pháp. –