UITableView重新加载数据/刷新(可能的重复问题)

时间:2010-01-05 16:21:34

标签: iphone objective-c uitableview reload

我在iPhone应用程序中有UITableView我正在刷新(通过在动作方法中调用[self.tableView reloadData]动态嵌入其中一个UITableView单元格中的UISegmentedControl。刷新以更新其中一个单元格的文本值。

但是,以下代码似乎会产生不必要的副作用。似乎每次UITableView刷新时,它都会在现有的UITegmentedControl上创建一个新的UISegmentedControl实例(可能还有图像 - 我不确定)。

我注意到这一点的唯一原因是,每次刷新时,UISegmentedControl周围都会形成一个几乎无法察觉的边框,应用程序会明显减慢。我非常感谢任何有关我目前困境的建议/代码解决方案。

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    NSUInteger section = indexPath.section;
    NSUInteger row = indexPath.row;

    // Set up the cell...       


    //populates the personal info section
    if (section == kPersonalInfoAddSection) {

        if (row == kNameRow) {

                    //Other code irrelevant to this question was removed for the sake of clarity
        }
        else if(row == kHeightRow) {

            cell.imageView.image = [UIImage imageNamed:@"tableview_height_label.png"];
                    //THIS IS THE TEXT I'M TRYING TO UPDATE
            cell.textLabel.text = [Formatter formatHeightValue:mainUser.heightInMM forZone:self.heightZone];
            cell.detailTextLabel.text = REQUIRED_STRING;

        }
    }

    //populates the units section
    if (section == kUnitsSection) {

        if (row == kHeightUnitsRow) {
            NSArray *heightUnitsSegments = [[NSArray alloc] initWithObjects:FT_AND_IN_STRING, M_AND_CM_STRING, nil];

            UISegmentedControl *heightUnitControl = [[UISegmentedControl alloc] initWithItems:heightUnitsSegments];

            CGRect segmentRect = CGRectMake(90, 7, 200, 30);
            [heightUnitControl setFrame:segmentRect];
            //[heightUnitControl setSelectedSegmentIndex:0];
            [heightUnitControl addTarget:self action:@selector(heightSegmentClicked:) forControlEvents:UIControlEventValueChanged];
            heightUnitControl.tag = kHeightSegmentedControlTag;

            cell.textLabel.text = @"Height:";
            cell.detailTextLabel.text = @"(units)";
            [cell.contentView addSubview:heightUnitControl];

            [heightUnitsSegments release];
            [heightUnitControl release];

        }
        else if(row == kWeightUnitsRow) {

                    //Other code irrelevant to this question was removed for the sake of clarity    

        }
    }

    return cell;
}

提前谢谢大家!

2 个答案:

答案 0 :(得分:2)

你是对的,它正在创建一个UISegmentedControl的新实例。这是因为您使用的是通用单元格标识符@“Cell”,然后每次都添加UISegmentedControl,从不删除它。包含UISegmentedControl的单元格被缓存,您将检索缓存的单元格并再次添加控件。

您可以使用更具体的单元格标识符,如果单元格!= nil,您知道它已包含UISegmentedControl。或者每次使用已经包含控件的缓存单元格时创建一个新单元格。

使用图像视图,您只需设置单元格图像视图属性,而无需向单元格添加新视图,以便一个可以,每次都会替换它。

由于您尝试更新的文本与UISegmentedControl没有关系,我认为您应该能够使用更具体的单元格标识符,并仅在单元格创建时添加控件。

答案 1 :(得分:0)

- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *arr1=[NSArray arrayWithObjects:@"img1.jpg",@"img2.jpg",nil];
    NSArray *arr2=[NSArray arrayWithObjects:@"img1.jpg",@"img2.jpg",@"img3.jpg",@"img4.jpg",@"img5.jpg",@"img6.jpg",nil];
    NSArray *arr3=[NSArray arrayWithObjects:@"img6.jpg",@"img5.jpg",@"img2.jpg",@"img1.jpg",nil];

    Imgs = [[NSArray alloc] initWithArray:[NSArray arrayWithObjects:arr1,arr2,arr3,nil]];


    NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys:@"Ahmedabad",@"Name",@"Picture 5.png",@"Rating",@"Picture 1.png",@"Photo",arr1,@"img",nil];
    NSDictionary *dic2=[NSDictionary dictionaryWithObjectsAndKeys:@"Rajkot",@"Name",@"Picture 5.png",@"Rating",@"Picture 2.png",@"Photo",nil];
    NSDictionary *dic3=[NSDictionary dictionaryWithObjectsAndKeys:@"Baroda",@"Name",@"Picture 5.png",@"Rating",@"Picture 7.png",@"Photo",nil];

    tblArray=[[NSArray alloc] initWithObjects:dic1,dic2,dic3,nil];
    [myTbl reloadData];

}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.navigationController.navigationBarHidden=NO;
    [self.navigationController.navigationBar setUserInteractionEnabled:YES];

}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.navigationController.navigationBarHidden=YES;
}



-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [tblArray count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSString *CellIdentifer=[NSString stringWithFormat:@"%i",indexPath.row];
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifer];
    if(cell==nil){
        cell=[self myCustomCell:CellIdentifer dicToSet:[tblArray objectAtIndex:indexPath.row]];
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }
    return cell;
}

-(UITableViewCell*)myCustomCell:(NSString*)CellIdentifer dicToSet:(NSDictionary*)dicToSet{
    UITableViewCell *cell=[[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 320, 44) reuseIdentifier:CellIdentifer] autorelease];

    UIImageView *imgV=[[UIImageView alloc] initWithFrame:CGRectMake(2, 2, 40, 40)];
    [imgV setImage:[UIImage imageNamed:[dicToSet valueForKey:@"Photo"]]];
    [cell addSubview:imgV];
    [imgV release];

    UILabel *lbl=[[UILabel alloc] initWithFrame:CGRectMake(44, 2, 276, 20)];
    [lbl setText:[dicToSet valueForKey:@"Name"]];
    [cell addSubview:lbl];
    [lbl setBackgroundColor:[UIColor clearColor]];
    [lbl setFont:[UIFont fontWithName:@"Helvetica-Bold" size:18]];
    [lbl release];


    UIImageView *imgV1=[[UIImageView alloc] initWithFrame:CGRectMake(44, 24, 70, 20)];
    [imgV1 setImage:[UIImage imageNamed:[dicToSet valueForKey:@"Rating"]]];
    [cell addSubview:imgV1];
    [imgV1 release];


    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    nxtPlcDtl=[[plcFullDtl alloc] initWithNibName:@"plcFullDtl" bundle:nil];
    nxtPlcDtl.dict=[[NSDictionary alloc] initWithDictionary:[tblArray objectAtIndex:indexPath.row]];
    nxtPlcDtl.Imgs = [Imgs objectAtIndex:indexPath.row];
    nxtPlcDtl.comment1 = [comment1 objectAtIndex:indexPath.row];
    nxtPlcDtl.vedio = [vedio objectAtIndex:indexPath.row];

    [self.navigationController pushViewController:nxtPlcDtl animated:YES];



    }