UITableView iphone中cellForRowAtIndexPath方法的问题(indexPath.row为null)

时间:2010-08-25 15:02:30

标签: iphone objective-c uitableview memory-management

表视图单元格管理让我在过去两天疯狂。请检查下面的代码,我会详细解释你的问题..

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    UILabel *nameLabel,*sugarLabel,*searchNameLabel,*searchSugarLabel;

    if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        CGFloat width = [UIScreen mainScreen].bounds.size.width - 50;
        CGFloat height = 20;
        CGRect frame = CGRectMake(10.0f, 10.0f, width, height);
        if(isSearchOn)
        {
            searchNameLabel = [[UILabel alloc] initWithFrame:frame];
            searchNameLabel.textColor = [UIColor blackColor];
            searchNameLabel.backgroundColor = [UIColor clearColor];
            searchNameLabel.textAlignment = UITextAlignmentLeft;
            searchNameLabel.font = [UIFont systemFontOfSize:14.0f];
            searchNameLabel.tag=260;
            [cell.contentView addSubview:searchNameLabel];
            [searchNameLabel release];

            searchSugarLabel= [[UILabel alloc] initWithFrame:frame];
            searchSugarLabel.textColor = [UIColor blackColor];
            searchSugarLabel.backgroundColor = [UIColor clearColor];
            searchSugarLabel.textAlignment = UITextAlignmentLeft;
            searchSugarLabel.font = [UIFont systemFontOfSize:14.0f];
            searchSugarLabel.tag=160;
            [searchSugarLabel setHidden:YES];
            [cell.contentView addSubview:searchSugarLabel];
            [searchSugarLabel release];
        }
        else{       
        nameLabel = [[UILabel alloc] initWithFrame:frame];
        nameLabel.textColor = [UIColor blackColor];
        nameLabel.backgroundColor = [UIColor clearColor];
        nameLabel.textAlignment = UITextAlignmentLeft;
        nameLabel.font = [UIFont systemFontOfSize:14.0f];
        nameLabel.tag=60;
        [cell.contentView addSubview:nameLabel];
        [nameLabel release];

        sugarLabel= [[UILabel alloc] initWithFrame:frame];
        sugarLabel.textColor = [UIColor blackColor];
        sugarLabel.backgroundColor = [UIColor clearColor];
        sugarLabel.textAlignment = UITextAlignmentLeft;
        sugarLabel.font = [UIFont systemFontOfSize:14.0f];
        sugarLabel.tag=160;
        [sugarLabel setHidden:YES];
        [cell.contentView addSubview:sugarLabel];
        [sugarLabel release];
        }
    }
    else {        

        if(isSearchOn)
        {
            searchNameLabel=(UILabel *)[cell.contentView viewWithTag:260];
            searchSugarLabel=(UILabel *)[cell.contentView viewWithTag:160];
        }
        else{
            nameLabel=(UILabel *)[cell.contentView viewWithTag:60];
            sugarLabel=(UILabel *)[cell.contentView viewWithTag:160];
        }

    }


    if (isSearchOn) { 

        cellValue = [searchResult objectAtIndex:indexPath.row]; 
        searchSugarLabel.text=cellValue.sugarId;
        NSString *searchText = [NSString stringWithFormat:@"%@ %@", cellValue.firstName, cellValue.lastName];
        searchNameLabel.text=searchText;
        NSLog(@"%@",searchNameLabel.text);
        NSLog(@"%@",searchSugarLabel.text);
    }


     else {

            NSString *contact=[contactKeys objectAtIndex:[indexPath section]];
            NSArray *contactSection=[contactNames objectForKey:contact];
            sugar=[db getSugarId:@"Contacts" bySection:contact andIndex:indexPath.row];


            NSString *cellText = [contactSection objectAtIndex:[indexPath row]];

            // split the text by the : to get an array containing { "AAA", "BBB" }
            NSArray *splitText = [cellText componentsSeparatedByString:@":"];

            // form a new string of the form "BBB AAA" by using the individual entries in the array
            NSString *contactText = [NSString stringWithFormat:@"%@ %@", [splitText objectAtIndex:1], [splitText objectAtIndex:0]];
            nameLabel.text = contactText;
            sugarLabel.text = sugar;
}
    return cell;
}

Contacts是一个具有firstName,lastName和sugar id属性的类。我将contacts类的属性分配给数据库方法中的变量并返回一个联系对象数组。 searchResult现在是一个联系对象数组。问题是当我在控制台上记录内容时,数据库获取其中的所有内容并返回一组联系人.searchResult中的联系人指向不同的内存位置但是当我尝试调试时在获得6个联系人之后的cellForRowAtIndexPath方法。第7个联系人指向与第1个相同的内存位置,因此在searchNameLabel.text中重复它返回null并且indexPath指向nil ...我认为这是单元格重用问题而且我接受我的表现非常糟糕。我需要弄清楚这一点,因为我要用这个结束我的项目......请大家帮助我......

仅当我尝试搜索联系人时才会发生这种情况。当我尝试将所有联系人加载到桌面上时它工作正常..

1 个答案:

答案 0 :(得分:2)

您正在if(cell== nil)块中初始化子视图,但在相应的else - 块中,您将再次覆盖它们。

您应该重新考虑您的设计:不要按searchon加载不同的视图,而是根据searchon设置其属性

if(cell == nil){
   //do all initializing
}

if(searchon){
    //set view/label properties for searching style
} else {
    //set view/label properties for not-searching style
}

另一种方法可能是为searchon /!searchon

分配完全分离的NIB文件
if(searchon){
    static NSString *SearchOnCellIdentifier = @"SearchOnCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: SearchOnCellIdentifier];
    if (cell == nil){
        //load cell from extra nib
    }

} else {
    static NSString *SearchOFFCellIdentifier = @"SearchOFFCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: SearchOFFCellIdentifier];
    if (cell == nil){
        //load cell from extra nib
    }
}

注意:我从未这样做,也没有经过测试。