UITableViewCell 内的 UISegmentedControl - 重新加载表时分段控件消失
Posted
技术标签:
【中文标题】UITableViewCell 内的 UISegmentedControl - 重新加载表时分段控件消失【英文标题】:UISegmentedControl inside a UITableViewCell - segmented control disappears when table reloads 【发布时间】:2013-06-02 00:10:33 【问题描述】:我搜索了论坛,但没有找到适合我情况的任何内容。我还是新手,所以这可能很简单,但我似乎无法弄清楚。
我有一个 UITableViewController 有几个部分。我创建了一个名为 SSSDataEntryCell 的自定义类,它允许用户输入文本。但是,在其中一个单元格中,我想用 UISegmentedControl 替换它。该代码在第一次显示表格时工作(控件出现,我可以选择一个段并且值更改),但是在任何类型的重新加载事件(旋转,滚动单元格不可见等)上,分段控制不再出现。
是否每次都需要重新创建分段控件?这似乎效率低下,尤其是因为它是一个 ivar。我曾尝试在添加之前释放单元格的子视图以及有关 *** 的许多其他建议,但似乎没有任何解决方法。提前致谢!
这是我的 .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 语句之前将它上移,并将文本设置为 nil ,以便它也恢复到初始状态.
【讨论】:
谢谢,解决了开关消失的问题。但是,现在出现了一个奇怪的问题,即在旋转时,调整大小时的开关在右侧变得太大(清晰到屏幕边框)。如果我旋转回来,它仍然太大了。它第一次出现时的大小是正确的。 如果用户没有为该单元格输入任何数据,则占位符用于第 1 节中的单元格显示“名称”。其他单元格不需要占位符,这就是为什么它在一个 if 语句中。 修复了调整大小的问题。我需要使用 [[cell contentView] bounds],而不是 [cell bounds]。有了这个修复,它就可以正常工作了。以上是关于UITableViewCell 内的 UISegmentedControl - 重新加载表时分段控件消失的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 内的 UIView 上的 UIGestureRecognizer
UITableViewCell 内的 UIStackView
如何增加 UItableviewcell 内的 UItableview 高度?
捏放大到 UITableViewCell 内的 UIImageView
iOS - UITableViewCell 内的 UIScrollView 内的 UIView 未触发 UITapGestureRecognizer