如何在UITableViewCell的子视图之间正确切换

时间:2014-05-26 21:39:38

标签: ios objective-c uitableview

我正在建立一个应用程序,其中我有一个tableview,我的用户可以在其中输入员工的信息。对于几乎所有可以添加到我的Employee对象的属性,我需要一个textfield,除了一个:我需要在tableview中有一个单元格来包含一个UISegmentedControl。

现在,这就是我最初想要这样做的方式

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
   {
        InfoCell *cell = (InfoCell *) [tableView dequeueReusableCellWithIdentifier:@"InfoCell"];
        if (cell == nil) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InfoCell" owner:self options:nil];
            cell = (InfoCell *) [nib objectAtIndex:0];
    }

if (tableView == infoTable) {
    cell.title.text = employeeInfoArray[indexPath.row];
    cell.content.tag = indexPath.row;
    cell.content.placeholder = @"Vul hier de gegevens in.";
    cell.contentSegmentedControl.hidden = YES;

    //determine textfield content
    if (indexPath.row == 0) {
        cell.content.text = employee.userID;
        cell.contentSegmentedControl.hidden = YES;
    } else if (indexPath.row == 1) {
        cell.content.text = employee.password;
        cell.contentSegmentedControl.hidden = YES;
    }else if (indexPath.row == 2) {
        cell.content.text = employee.name;
        cell.contentSegmentedControl.hidden = YES;
    }else if (indexPath.row == 3) {
        NSMutableArray *companies = [[NSMutableArray alloc] init];
        for (int i = 0; i < store.companies.count; i++) {
            Company *companyClass = store.companies[i];
            [companies addObject:companyClass.companyKey];
        }
        cell.contentSegmentedControl.hidden = NO;
        cell.contentSegmentedControl = [[UISegmentedControl alloc] initWithItems:companies];
        cell.contentSegmentedControl.tag = 2222;
        [cell.contentSegmentedControl addTarget:self action:@selector(segmentedControlEvent:) forControlEvents:UIControlEventValueChanged];
        cell.content.hidden = YES;
    }
}
cell.backgroundColor = [UIColor clearColor];

return cell;

}

请注意,我从这个概述中删除了很多单元格,因为你从这个例子中得到了系统的本质,只有很少的单元格:每次加载一个单元格时,它会检查它有哪个索引路径,以及需要做的是,将textfield(称为content)设置为隐藏,或将contentSegmentedControl设置为隐藏。

我遇到的问题是,当我正常向上和向下滚动我的桌面视图时,它会正确显示所有内容。但是,当我开始快速向前和向后滚动时,我将contentSegmentedControll放在各种不属于它的单元格中。

我非常好奇为什么会这样,以及如何解决这个问题。我自己的建议是添加多个自定义tableviewcells,但我不知道如何正确地做到这一点。

简而言之: 我如何防止我的uisegmentedcontrol(仅在我的tableViewCells中有一个)在滚动时在随机单元格中弹出?

2 个答案:

答案 0 :(得分:0)

您确定在未粘贴的每种情况下都隐藏了segmentedControl吗?如果没有,试试这个:

if (indexPath.row == 3) {
    cell.segmentedControl.hidden = YES;
} else {
    cell.segmentedControl.hidden = NO;
}

并删除在其他地方引用segmentedControl的代码

答案 1 :(得分:0)

加载包含UISegmentedControl的单元格时可能会出现延迟,因为每次滚动时,单元格必须在显示单元格之前填充companies数组。

要解决此问题,请考虑降低companies数组的加载频率,例如,将其值存储在property中,并调用tableView:reloadData甚至更好tableView:reloadRowsAtIndexPaths:withRowAnimation如果数组companies的内容发生变化。