2013-06-02 28 views
1

我搜索了论坛,但还没有找到适合我的情况的任何内容。我在这方面仍然是新手,所以这可能很简单,但我似乎无法弄清楚。UITableViewCell中的UISegmentedControl - 表重新加载时分段控件消失

我有一个UITableViewController有几个部分。我创建了一个名为SSSDataEntryCell的自定义类,允许用户输入文本。但是,在其中一个单元格中,我想用UISegmentedControl替换它。该代码在第一次显示表格时出现(控件出现,我可以选择一个段并更改值),但对于任何类型的重新加载事件(旋转,滚动单元格不可见等),分段控制不再出现。

我是否需要每次都重新创建分段控件?这似乎效率低下,特别是因为它是一个伊娃。我曾尝试在添加之前释放单元格的子视图,并在stackoverflow上提供了其他一些建议,但似乎没有解决这个问题。提前致谢!

这里是我的.h的相关部分

@interface SSSEditDetailViewController : UITableViewController <UITextFieldDelegate> 
{ 
    // lets us set the sex (male, female) 
    UISegmentedControl *sexSwitch; 
} 

这里是.M

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Load the NIB file for our custom cell 
    UINib *nib = [UINib nibWithNibName:@"SSSDataEntryTableCell" bundle:nil] ; 

    // Register the NIB which contains the cell 
    [[self tableView] registerNib:nib forCellReuseIdentifier:@"SSSDataEntryTableCell"] ; 

    // 
    // set up the sex switch if needed 
    // 
    if (sexSwitch == nil) 
    { 
     NSArray *values = [[NSArray alloc] initWithObjects:kSSSMale, kSSSFemale, nil] ; 
     sexSwitch = [[UISegmentedControl alloc] initWithItems:values] ; 
     [sexSwitch addTarget:self action:@selector(changeSex:) 
        forControlEvents:UIControlEventValueChanged] ; 
     [sexSwitch setSegmentedControlStyle:UISegmentedControlStyleBar] ; 
    } 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SSSDataEntryTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SSSDataEntryTableCell"] ; 

    if ([indexPath section] == 0) 
    { 
     [[cell dataField] setDelegate:self] ; 
     [[cell dataField] setOurPath:indexPath] ; 

     [[cell dataField] setText:[person name]] ; 
     [[cell dataField] setPlaceholder:@"Name"] ; 
    } 
    else if ([indexPath section] == 1) 
    { 
     // Sex switch; 
     [cell setAccessoryType:UITableViewCellAccessoryNone] ; 

     // get cell frame and put the sex switch in its place 
     [sexSwitch setFrame:[cell frame]] ; 
     [sexSwitch setAutoresizingMask:UIViewAutoresizingFlexibleWidth] ; 

     [[cell contentView] addSubview:sexSwitch] ; 
    } 

    return cell ; 
} 

回答

1

你的主要问题是使用电池的框架来设置交换机的帧的相关部分。如果您记录cell.frame,当您上下滚动时,您有时会看到大量的y值,所以有时您的开关不在屏幕的底部。这很容易解决,使用边界而不是框架。

您还有另一个问题,因为单元格被重用,交换机可能会显示在其他单元格上,而不是它应该是的。如果您要在代码中添加交换机,您需要在执行if语句之前将其删除,以便从原始单元格开始。要做到这一点的方法之一,就是给交换机一个标签,并与标签去除观点:

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

     SSSDataEntryTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SSSDataEntryTableCell"] ; 
     [[cell.contentView viewWithTag:47] removeFromSuperview]; 
     [[cell dataField] setText:nil]; 
     [[cell dataField] setPlaceholder:@"Name"] ; 

     if ([indexPath section] == 0) 
     { 
      [[cell dataField] setDelegate:self] ; 
      [[cell dataField] setOurPath:indexPath] ; 

      [[cell dataField] setText:[person name]] ; 
     } 
     else if ([indexPath section] == 1) 
     { 
      // Sex switch; 
      [cell setAccessoryType:UITableViewCellAccessoryNone] ; 
      // get cell frame and put the sex switch in its place 
      [sexSwitch setFrame:[cell bounds]]; 
      [sexSwitch setAutoresizingMask:UIViewAutoresizingFlexibleWidth] ; 
      sexSwitch.tag = 47; 
      [[cell contentView] addSubview:sexSwitch] ; 
     } 
     return cell ; 
    } 

我不知道你有占位做什么,但你可能想给它动起来在if语句之前,还要将文本设置为零,以便它回到初始状态。

+0

谢谢,这修复了消失的开关问题。但是,现在出现了一个奇怪的问题,即在旋转时,调整大小的开关在右侧变得太大(向屏幕的边界移动)。如果我旋转回来,它仍然太大。第一次出现时尺寸合适。 –

+0

如果用户未输入该单元格的任何数据,则占位符用于第1节中的单元格显示“名称”。其他单元不需要占位符,所以这就是为什么它在一个if语句中。 –

+0

修复了调整大小的问题。我需要使用[[cell contentView]边界],而不是[单元格边界]。有了这个修复,它工作得很好。 –

相关问题