我使用的数组包含来自两个词典的对象,并在第一个单元格上显示第一个词典的对象,第一个单元格具有不同的标识符,与第二个词典对象相同。
查看我在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;
}
现在我想要的是,如果任何字典为空,则该字典对应的单元格不应该是可见的,现在可见。
答案 0 :(得分:2)
一些事情:
请勿从nil
返回-tableView:cellForRowAtIndexPath:
。对于每个(可见)行,该方法只被调用一次,并且该表假定它具有与-tableView:numberOfRowsInSection:
的返回值一样多的行。默认为nil
会导致代码不一致。
通过该标记,单元格出列应该永远不会失败。我建议您切换到更新的方法:-dequeueReusableCellWithIdentifier:forRowAtIndexPath:
。当重用池中没有单元时,它会为您分配新的单元格。
正在重复使用细胞。单个单元格可能会多次重复使用:如果每次添加新标签,它们都会堆积起来。而是在接口构建器中将标签添加到单元格中,并在配置单元格时设置出口以引用它们。
而不是“跳过行”,使您的数据模型与您要显示的内容保持一致。如果你有一个包含你想要跳过的对象的数组,首先过滤你的数组,然后使用过滤后的数组作为数据源。
// 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"];