2010-01-05 151 views
1

我有一个UITableView在我正在刷新的iPhone应用程序中(通过在动作方法中调用[self.tableView reloadData]动态嵌入到其中一个UITableView单元中的UISegmentedControl。以更新其中一个单元格的文本值UITableView重新加载数据/刷新(可能的重复问题)

但是,下面的代码似乎产生了一个不需要的副作用,看来每次UITableView刷新它时都会创建一个新的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

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

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

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

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

+0

更好的是,创建一个自定义的UITableViewCell子类并使用它。如果您有更复杂的需求,没有理由限制自己使用默认的单元格类型。 – TechZen 2010-01-05 20:08:07

+0

感谢您的回答。我只是想知道如何定制UITableViewCells在这种特殊情况下会有所帮助(我对iPhone开发相对较新)。 此外,似乎使用自定义单元格意味着分组视图中单元格的圆角外观消失(由方形conrners取代)。 – Urizen 2010-01-06 13:53:10

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]; 



    } 
+0

我敢肯定,这是张贴在错误的线程。 – TechZen 2010-01-05 20:06:04