UITableView列表不显示所有项目

时间:2012-01-01 23:08:49

标签: uitableview ios4

在我的UITableView中,我试图显示我的plist中的所有项目,但它没有显示所有项目。实际上它显示了大部分内容,但由于一些奇怪的原因,较低的项目正在重复。我基本上想要用它们各自的值显示plist中的所有键。列表显示的时间太长了吗?大约有30个项目。

首先,我尝试对键进行排序,并认为这是问题,所以我根本没有排序,我得到了同样的问题,在列表中降低了项目重复而不显示最后3项。有限制吗?

下面是一些代码,我刚修改为适合:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier1 = @"PreferencesCell1";
    static NSString *CellIdentifier2 = @"PreferencesCell2";
    static NSString *CellIdentifier3 = @"PreferencesCell3";

    UITableViewCell *cell;     

    NSArray *keys = [[[preferences objectAtIndex:indexPath.section] objectForKey:@"Rows"] allKeys];
    NSString *prefName = [keys objectAtIndex:indexPath.row];

    if (indexPath.section == 0 || indexPath.section == 2) {

        if(indexPath.section == 0)
            cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
        else if(indexPath.section == 2)
            cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];

        if (cell == nil) {

            if(indexPath.section == 0)
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1] autorelease];
            else if(indexPath.section == 2)
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2] autorelease];

            cell.accessoryType = UITableViewCellAccessoryNone;

            CGRect labelRect = CGRectMake(10, 5, 300, 31);
            UILabel *settingName = [[UILabel alloc] initWithFrame:labelRect];
            settingName.font = [UIFont boldSystemFontOfSize:17.0];
            settingName.backgroundColor = [UIColor clearColor];
            settingName.text = prefName;


            [cell.contentView addSubview: settingName];
            [settingName release];

        }

    } else if(indexPath.section == 1) {

        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier3];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier3] autorelease];

            CGRect labelRect = CGRectMake(10, 5, 300, 31);
            UILabel *label = [[UILabel alloc] initWithFrame:labelRect];
            label.font = [UIFont boldSystemFontOfSize:17.0];
            label.backgroundColor = [UIColor clearColor];

            label.text = prefName;

            [cell.contentView addSubview: label];
        }

        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    } 

    return cell;
}

我发现如果我不使用标签,只需要使用通用的cell.textLabel.text方法,那么所有项目都会正确显示。但是,如果我使用UILabel方法,则不显示底部项目。当我在Cell中添加其他项目时,我需要走这条路。

工作守则。

必须首先创建单元格的初始化和创建,然后使用从superview中删除的引用单元格,然后渲染子视图。所以从上面重新排序代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier1 = @"PreferencesCell1";
        static NSString *CellIdentifier2 = @"PreferencesCell2";
        static NSString *CellIdentifier3 = @"PreferencesCell3";

        UITableViewCell *cell;     

        NSArray *keys = [[[preferences objectAtIndex:indexPath.section] objectForKey:@"Rows"] allKeys];
        NSString *prefName = [keys objectAtIndex:indexPath.row];

        // Create/Initialize Cell first

        if (indexPath.section == 0 || indexPath.section == 2) {

            if(indexPath.section == 0)
                cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
            else if(indexPath.section == 2)
                cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];

            if (cell == nil) {

                if(indexPath.section == 0)
                    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1] autorelease];
                else if(indexPath.section == 2)
                    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2] autorelease];   
            }

        } else if(indexPath.section == 1) {

            cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier3];

            if (cell == nil) {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier3] autorelease];
            }
        } 

        // remove from superview

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

        // render the subviews

        if (indexPath.section == 0 || indexPath.section == 2) {

            cell.accessoryType = UITableViewCellAccessoryNone;

            CGRect labelRect = CGRectMake(10, 5, 300, 31);
            UILabel *settingName = [[UILabel alloc] initWithFrame:labelRect];
            settingName.font = [UIFont boldSystemFontOfSize:17.0];
            settingName.backgroundColor = [UIColor clearColor];
            settingName.text = prefName;


            [cell.contentView addSubview: settingName];
            [settingName release];

        } else if(indexPath.section == 1) {

            CGRect labelRect = CGRectMake(10, 5, 300, 31);
            UILabel *label = [[UILabel alloc] initWithFrame:labelRect];
            label.font = [UIFont boldSystemFontOfSize:17.0];
            label.backgroundColor = [UIColor clearColor];

            label.text = prefName;

            [cell.contentView addSubview: label];

            cell.accessoryType = UITableViewCellAccessoryNone;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }

        return cell;
    }

2 个答案:

答案 0 :(得分:1)

看起来单元格正在重复使用,您只是在其现有内容中添加新视图。您需要重置内容,如下所述:UITbleViewCell Class Reference。如果您每次只设置单元格的textLabel,则设置新值就足够了,但如果您要添加子视图,则可能需要更多类似[cell.contentView.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

的内容

答案 1 :(得分:0)

Tableview的限制是可用的RAM大小。

请发布一些代码。但我认为这可能是细胞缓存的问题。