iOS中tableview中的多个单元格标识符

时间:2016-01-13 07:22:09

标签: ios objective-c uitableview dictionary

我使用的数组包含来自两个词典的对象,并在第一个单元格上显示第一个词典的对象,第一个单元格具有不同的标识符,与第二个词典对象相同。

查看我在cellforrowatindexpath中的代码

static NSString *cellIdentifier = @"cellIdentifier1";
    static NSString *customCellIdentifier = @"cellIdentifiercustom";

    if (indexPath.row == 0) {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        //        if (cell==nil)
        {
            cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

        }
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        ExcName = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 2.0, 250.0, 36.0)];
        ExcName.font = [UIFont systemFontOfSize:12.0];
        ExcName.textColor = [UIColor blackColor];
        ExcName.textAlignment = NSTextAlignmentLeft;
        ExcName.text=[[exerciseAr objectAtIndex:indexPath.row] objectForKey:@"activityname"];
        ExcName.numberOfLines=3;
        [cell.contentView addSubview:ExcName];

        return  cell;
    }
    else{
        UITableViewCell *customcell = [tableView dequeueReusableCellWithIdentifier:customCellIdentifier];

        //        if (cell==nil)
        {
            customcell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:customCellIdentifier];

        }
        customcell.selectionStyle = UITableViewCellSelectionStyleNone;
        ExcName = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 2.0, 250.0, 36.0)];
        ExcName.font = [UIFont systemFontOfSize:12.0];
        ExcName.textColor = [UIColor blackColor];
        ExcName.textAlignment = NSTextAlignmentLeft;
        ExcName.text=[[exerciseAr objectAtIndex:indexPath.row] objectForKey:@"exercisename"];
        //    ExcName.text=[[exerciseAr objectAtIndex:indexPath.row] objectForKey:@"exercisename"];

        ExcName.numberOfLines=3;
        [customcell.contentView addSubview:ExcName];

                return  customcell;
    }

    return nil;
}

现在我想要的是,如果任何字典为空,则该字典对应的单元格不应该是可见的,现在可见。

2 个答案:

答案 0 :(得分:2)

一些事情:

  1. 请勿从nil返回-tableView:cellForRowAtIndexPath:。对于每个(可见)行,该方法只被调用一次,并且该表假定它具有与-tableView:numberOfRowsInSection:的返回值一样多的行。默认为nil会导致代码不一致。

  2. 通过该标记,单元格出列应该永远不会失败。我建议您切换到更新的方法:-dequeueReusableCellWithIdentifier:forRowAtIndexPath:。当重用池中没有单元时,它会为您分配新的单元格。

  3. 正在重复使用细胞。单个单元格可能会多次重复使用:如果每次添加新标签,它们都会堆积起来。而是在接口构建器中将标签添加到单元格中,并在配置单元格时设置出口以引用它们。

  4. 解决方案:

    而不是“跳过行”,使您的数据模型与您要显示的内容保持一致。如果你有一个包含你想要跳过的对象的数组,首先过滤你的数组,然后使用过滤后的数组作为数据源。

    // Call this method once before reloading the table view
    - (void) filterDictionaries
    {
        // (filteredArray is an ivar defined as NSMutableArray*)
    
        for (NSDictionary* dictionary in exerciseAr) {
    
            if ([dictionary  objectForKey:@"exercisename"] != nil) {
                [filteredArray addObject: dictionary];
            }
        }   
        // Now you can use filteredArray as the data source 
        // instead of exerciseAr, without worrying about skipping 
        // entries.
    }
    
    - (NSInteger) tableView:(UITableView*) tableView numberOfRowsInSection:(NSInteger) section
    {
        return [filteredArray count];
    }
    
    - (UITableViewCell*) tableView:(UITableView*) tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath
    {
        static NSString *cellIdentifier = @"cellIdentifier1";
        static NSString *customCellIdentifier = @"cellIdentifiercustom";
    
        UITableViewCell* cell;
    
        if (indexPath.row == 0) {
            cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forRowAtIndexPath:indexPath];
        }
        else{
            cell = [tableView dequeueReusableCellWithIdentifier:customCellIdentifier forRowAtIndexPath:indexPath];
        }
    
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
        cell.excLabel.text =  [[filteredArray objectAtIndex:indexPath.row]
    
        return  cell;
    }
    

答案 1 :(得分:1)

这实际上取决于你的字典为空的意思。它可能是零,或者它只是没有键的任何值,例如键的值是空字符串。所以,我想说,加上NibolasMiari的答案,检查两个案例。

- (void) filterDictionaries:(NSArray*) exerciseAr{
    filteredArray = [[NSMutableArray alloc]init];

    for (NSDictionary* myDict in exerciseAr) {
        if ([myDict isKindOfClass:[NSNull class]]) {
           continue;
        }
        else if ([myDict count] == 0) {
            continue;
        }
        else{
            [filteredArray addObject: myDict];
        }
    }   
}

- (NSInteger) tableView:(UITableView*) tableView numberOfRowsInSection:(NSInteger) section
{
    return [filteredArray count];
}

现在在你的cellforIndexPath方法中,所有内容都是相同的,只是按照以下方式更改了行 -

在if块中,你有

ExcName.text=[[exerciseAr objectAtIndex:indexPath.row] objectForKey:@"activityname"];

成功 -

ExcName.text=[[filteredArray objectAtIndex:indexPath.row] objectForKey:@"activityname"];

在else块中,你有

ExcName.text=[[exerciseAr objectAtIndex:indexPath.row] objectForKey:@"exercisename"];

成功 -

ExcName.text=[[filteredArray objectAtIndex:indexPath.row] objectForKey:@"exercisename"];