IOS在UITableView中插入一行

时间:2014-07-10 06:59:31

标签: ios iphone objective-c uitableview

所以我有这个项目的最后期限,我一直在努力,所以我现在很累。我不知道我是不是因为我做错了而愚蠢而且视而不见但是我有一个问题需要帮助。

所以,我正在尝试实现一种“扩展的tableview设置”(就像在IOS 7日历中,您可以点击开始和结束日期,并使用日期选择器弹出一个单元格)。我有两个不同的单元格,可以在一个抽头单元格下显示。除了实际的单元格之外它工作得很好,当我插入一行时显示错误的单元格。我将给出一些背景信息......我在第0部分有两个单元格,当你点击第一个单元格时,它会在它下面插入一个应该是一个选择器单元格的单元格。相反,它会插入与未修改的tableview的第1行相同的调用。

以下是相关代码:

@interface AddMealTableViewController ()
@property (nonatomic) BOOL datePickerEnabled;
@property (nonatomic) BOOL pickerEnabled;
@property (nonatomic, strong) NSIndexPath *datePickerIndexPath;
@property (nonatomic, strong) NSIndexPath *pickerIndexPath;

@end

@implementation AddMealTableViewController


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    switch (section) {
        case 0:
            return 2 + (self.datePickerEnabled) + (self.pickerEnabled);
            break;

        default:
            return self.mealComponents.count;
            break;
    }
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.section) {
        case 0:
        {
            if (indexPath.row == 1) {
                TimeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TimeCell"];
                cell.timeLabel.text = @"Now";
                cell.mealTypeLabel.text = self.selectedMealType;
                return cell;
            }
            else if (indexPath == self.datePickerIndexPath) {
                UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DateCell"];
                return cell;
            }
            else if (indexPath == self.pickerIndexPath) {    
                UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PickerCell"];
                return cell;
            }
            else {
                UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MealTypeCell"];

                cell.textLabel.text = @"Meal Type";
                cell.detailTextLabel.text = self.selectedMealType;
                return cell;
            }
            break;
        }

        default:
        {
            ComponentCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ComponentCell"];
            if (!cell) {
                cell = [ComponentCell new];
            }
            MealComponent *mc = self.mealComponents[indexPath.row];
            [cell setUpWithComponent:mc];
            return cell;
            break;
        }
    }
    return nil;
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0) {
        if (indexPath == self.datePickerIndexPath || indexPath == self.pickerIndexPath) {
            return 200;
        }
        return self.tableView.rowHeight;
    }
    return 70;
}

- (void)toggleDatePickerForSelectedIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView beginUpdates];

    NSArray *indexPaths = @[[NSIndexPath indexPathForRow:indexPath.row + 1 inSection:0]];

    if (self.datePickerEnabled)
    {
        self.datePickerEnabled = NO;
        self.datePickerIndexPath = nil;
        [self.tableView deleteRowsAtIndexPaths:indexPaths
                              withRowAnimation:UITableViewRowAnimationFade];

    }
    else
    {
        self.datePickerIndexPath = indexPaths.lastObject;
        self.datePickerEnabled = YES;

        [self.tableView insertRowsAtIndexPaths:indexPaths
                              withRowAnimation:UITableViewRowAnimationFade];
    }

    [self.tableView endUpdates];
}

- (void)togglePickerForSelectedIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView beginUpdates];

    NSArray *indexPaths = @[[NSIndexPath indexPathForRow:indexPath.row + 1 inSection:0]];

    if (self.pickerEnabled)
    {
        self.pickerEnabled = NO;
        self.pickerIndexPath = nil;
        [self.tableView deleteRowsAtIndexPaths:indexPaths
                              withRowAnimation:UITableViewRowAnimationFade];

    }
    else
    {
        self.pickerIndexPath = indexPaths.lastObject;
        self.pickerEnabled = YES;


        [self.tableView insertRowsAtIndexPaths:indexPaths
                              withRowAnimation:UITableViewRowAnimationFade];
    }

    [self.tableView endUpdates];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0) {
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        if ([cell.reuseIdentifier isEqual: @"TimeCell"]) {
            [self toggleDatePickerForSelectedIndexPath:indexPath];
        }
        else if ([cell.reuseIdentifier isEqual: @"MealTypeCell"]) {
            [self togglePickerForSelectedIndexPath:indexPath];
        }
    }

}

有什么想法吗?我真的无法把手指放在上面。

2 个答案:

答案 0 :(得分:1)

为什么不将日期选择器单元格的高度从0更改为200而不是插入(或删除)日期选择器单元格。我认为这更简单。(这是我用来实现的)

调用[tableView didSelectRowAtIndexPath:]时,只需调用[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]即可更新单元格。

您可以在已知的[tableView heightForRowAtIndexPath:]中管理单元格的高度。

[编辑]

我再次检查你的代码。

else if (indexPath == self.datePickefIndexPath)

中将else if([indexPath isEqual:self.datePickerIndexPath])更改为[tableView:cellForRowAtIndexPath:]

答案 1 :(得分:0)

有很多方法可以处理这类事情。您实际上不需要插入或删除单元格,只需将单元格高度从0修改为适当的高度即可。为此,您可以设置一个标志来检查单元格是否已扩展。