TableView Datasource должен вернуть ячейку, проверить код - PullRequest
0 голосов
/ 02 марта 2010

Отладчик выкинул мне эту ошибку

UITableView dataSource должен return a cell от tableView:cellForRowAtIndexPath:

это мой код:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell   = nil;
    NSString        *text   = nil;
    NSInteger       section = indexPath.section;
    NSInteger       row     = indexPath.row;

    switch (section) 
    {
        case PURCHASE_SECTION:
        {   
            static NSString *cellID = @"GenericCell";

            cell = [tableView dequeueReusableCellWithIdentifier:cellID];

            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                               reuseIdentifier:cellID] autorelease];
                cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            }

            switch (row) 
            {
                case CATEGORY_ROW:
                    text                        = [self.purchase.category valueForKey:@"name"];
                    cell.textLabel.text         = text;
                    cell.accessoryType          = UITableViewCellAccessoryNone;
                    cell.editingAccessoryType   = UITableViewCellAccessoryDisclosureIndicator;
                    break;
                case TYPE_ROW:
                    text                        = [self.purchase.type valueForKey:@"name"];
                    cell.textLabel.text         = text;
                    cell.accessoryType          = UITableViewCellAccessoryNone;
                    cell.editingAccessoryType   = UITableViewCellAccessoryDisclosureIndicator;
                    break;
                case VENDOR_ROW:
                    text                        = [self.purchase.vendor valueForKey:@"name"];
                    cell.textLabel.text         = text;
                    cell.accessoryType          = UITableViewCellAccessoryNone;
                    cell.editingAccessoryType   = UITableViewCellAccessoryDisclosureIndicator;
                    break;
                case NOTES_ROW:
                    text                        = @"Notes";
                    cell.textLabel.text         = text;
                    cell.accessoryType          = UITableViewCellAccessoryNone;
                    cell.editingAccessoryType   = UITableViewCellAccessoryDisclosureIndicator;
                    break;
                default:
                    break;
            }
            break;
        }
        case ITEMS_SECTION:
        {
            NSUInteger  itemsCount = [purchase.items count];

            if (row < itemsCount) 
            {
                static NSString *itemsCellID = @"ItemsCell";

                cell = [tableView dequeueReusableCellWithIdentifier:itemsCellID];

                if (cell == nil)
                {
                    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
                                                   reuseIdentifier:itemsCellID] autorelease];
                    cell.accessoryType = UITableViewCellAccessoryNone;
                }

                PurchaseItem *item          = [items objectAtIndex:row];
                cell.textLabel.text         = item.name;
                cell.detailTextLabel.text   = [item.amount formattedDataDisplay];
            } 
            else 
            {
                static NSString *AddItemCellID = @"AddItemCell";

                cell = [tableView dequeueReusableCellWithIdentifier:AddItemCellID];

                if (cell == nil) 
                {
                    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                                   reuseIdentifier:AddItemCellID] autorelease];
                    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
                }
                cell.textLabel.text = @"Add Item";
            }
            break;
        }
        case LOCATION_SECTION:
        {
            text = @"Purchase Location";
            cell.accessoryType          = UITableViewCellAccessoryDisclosureIndicator;
            cell.editingAccessoryType   = UITableViewCellAccessoryNone;
            break;
        }
        default:
            break;
    }
    cell.textLabel.text = text;
    return cell;
}

Кажется, я просто не могу определить ошибку, и я мог бы использовать несколько свежих глаз.

Ответы [ 2 ]

4 голосов
/ 02 марта 2010

cell никогда не устанавливается внутри case LOCATION_SECTION:.

Кроме того, иногда вы устанавливаете cell.textLabel.text в значение в блоке case, только чтобы сбросить его до nil позже через cell.textLabel.text = text. Конечно, это не предназначено?

0 голосов
/ 03 марта 2010

Хорошо, теперь я просто чувствую себя глупо, похоже, я упустил важный фрагмент кода, включающий в себя удаление из ячейки в случае LOCATION_SECTION. Я добавил его, и ошибка исчезла, и я хотел бы поблагодарить «rpetrich» за то, что он указал на то, что я оставил в коде из предыдущего раза «cell.textlabel.text = text;», и это тоже нужно было удалить, так что СПАСИБО.

...