我搜索了论坛,但没有发现任何适合我情况的内容。我还是新手,所以它可能很简单,但我似乎无法弄明白。
我有一个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 ;
}
答案 0 :(得分: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语句之前将其移动,并且还将文本设置为nil,以便它也恢复到初始状态