2

我在 iOS6 上没有这个问题,但目前在 iOS7 上遇到了这个问题。我有一个 UITableView,你可以在加载视图时看到 8 个单元格。每个都填充了来自和数组的不同名称。如果向下滚动,接下来的两个单元格看起来不错,但所有过去的内容都放在上面;该文本是先前单元格中的内容。因此,第 10 个单元格将包含第一个单元格中的内容,以及位于其顶部的第 10 个单元格中应该包含的内容。

代码:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }

        //Create Label for Name inside cell
        UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake( 7.0, 5.0, 300.0, 30.0 )];
        [name setText:[self.entriesArray objectAtIndex:indexPath.row]];


        //Check to see if current person is a Parent or Child
        NSString *class = [self.database getCellDataWithMembership:[self.MembershipArray objectAtIndex:indexPath.row] andColIndex:4];

        if([class isEqualToString:@"CHILD"])
        {
            name.textColor = [UIColor colorWithRed:25.0f/255.0f green:111.0f/255.0f blue:45.0f/255.0f alpha:1.0f];
            name.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.0];                
        }

        [cell.contentView addSubview:name];
        return cell;
}

我对表格视图的技能充其量只是临时性的。我一直在阅读大量文档并研究解决方案,但无法提出解决方案。我觉得奇怪的是它非常适合 iOS6,但不适用于 iOS7。

所以它从一个数组中获取一个人的名字,我想用这些名字填充单元格。我最初能够使用以下方法完成此操作:

cell.textLabel.text = [self.entriesArray objectAtIndex:indexPath.row];

if([class isEqualToString:@"CHILD"])
{
    cell.textLabel.textColor = [UIColor colorWithRed:25.0f/255.0f green:111.0f/255.0f blue:45.0f/255.0f alpha:1.0f];
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.0];

如果我使用它而不是第一个代码块中的“名称” UILabel 操作,那么它会完美地显示名称而没有文本覆盖,但成为问题的是文本颜色。如果它们被标记为儿童,那么它们应该是绿色文本和粗体。但是,向下滚动后,每个人在不应该的时候都会变成绿色。

很抱歉这个冗长的问题。我一直在研究这个问题并绞尽脑汁,但我似乎无法弄清楚。任何帮助将不胜感激。

4

5 回答 5

1

我正在动态地将 UI 对象添加到单元格中。正如“caglar”所说,添加然后删除可能不是最佳实践。但是,我也在这样做。我在每次显示时向单元格添加大量 UI 对象的方法是首先删除我的所有子视图。然后 willDisplayCell 委托将它们添加回来。显然,如果您只想删除某些视图,则必须标记视图并在删除时更有选择性。但是您可以使用以下内容删除所有内容。

-(void)tableView:(UITableView *)tableView
 willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath {

    [[cell.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
}

只需确保您将标签添加/删除到单元格的 contentView。在 iOS7 中,如果您不小心,您也会将其删除。

希望它可以帮助你。

于 2013-10-21T08:00:20.493 回答
0

你可以试试这个方法,当cell是时nil,你需要创建UILabel* name,然后你用标签设置name标签name.tag = 1000,然后你可以用这个方法访问这个标签UILabel* name = (UILabel*)[cell.contentView viewWithTag:1000];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        //Create Label for Name inside cell
        UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake( 7.0, 5.0, 300.0, 30.0 )];
        name.tag = 1000;
        [cell.contentView addSubview:name];
    }

    UILabel* name = (UILabel*)[cell.contentView viewWithTag:1000];
    [name setText:[self.entriesArray objectAtIndex:indexPath.row]];


    //Check to see if current person is a Parent or Child
    NSString *class = [self.database getCellDataWithMembership:[self.MembershipArray objectAtIndex:indexPath.row] andColIndex:4];

    if([class isEqualToString:@"CHILD"])
    {
        name.textColor = [UIColor colorWithRed:25.0f/255.0f green:111.0f/255.0f blue:45.0f/255.0f alpha:1.0f];
        name.font = [UIFont fontWithName:@"Helvetica-Bold" size:17.0];                
    }

    return cell;

}

于 2013-12-18T03:50:02.033 回答
0

cellForRowAtIndexPath:在您的代码中,只要调用方法,标签就会添加到单元格中。我的意思是你多次添加标签。您可以删除之前添加的标签。

//If label was added with tag = 500, remove it
for (UIView *sv in cell.contentView.subviews)
{
    if (sv.tag == 500)
    {
        [sv removeFromSuperview];
    }
}

//Create Label for Name inside cell
UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake( 7.0, 5.0, 300.0, 30.0 )];
[name setText:[self.entriesArray objectAtIndex:indexPath.row]];
name.tag = 500;

然而,这个解决方案并不是一个好的解决方案。我认为创建自定义UITableViewCell是正确的做法。

于 2013-09-27T19:58:57.713 回答
-1

您可以使用 ios6/7 delta 显示的大小检查器来设置 uilabels。首先通过更改值 x、y、width、height 设置 ios7 的总视图,然后更改 ios6/7 delta 中的值以使其适用于 ios6。希望你得到

于 2013-09-27T06:10:59.687 回答
-2

您可以更改此代码。

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; -> UITableViewCell *cell = nil;
于 2013-09-27T06:57:25.767 回答