将 UISwitch 添加到 TableView 中的一个单元格
Posted
技术标签:
【中文标题】将 UISwitch 添加到 TableView 中的一个单元格【英文标题】:Add UISwitch to only one cell in TableView 【发布时间】:2013-03-11 19:42:03 【问题描述】:我试图将 UISwitch 添加到我的表格视图中的一个单元格中,代码如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
FormCell *cell = (FormCell *) [tableView dequeueReusableCellWithIdentifier: @"FormCell"];
if(cell == nil) cell = [[FormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FormCell"];
if(indexPath.row == 3)
UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(100, 9, 50, 50)];
[mySwitch addTarget: self action: @selector(flip:) forControlEvents:UIControlEventValueChanged];
[cell.contentView addSubview:mySwitch];
[[UISwitch appearance] setOnTintColor:[UIColor colorWithRed:163.0/255.0 green:12.0/255.0 blue:17.0/255.0 alpha:1.0]];
return cell;
它的工作原理,问题是当我向上或向下滚动表格视图时,它会复制 UISwitch,但最终还是在表格视图的开头...
有什么帮助吗?
【问题讨论】:
我们可以得到更多tableView:heightForRowAtIndexPath
吗?
@Larme 编辑以便更好地理解。
【参考方案1】:
记住单元格可以重复使用。你最好用自己的标识符创建一个自定义 UITableViewCell 。在那里做你的定制。
【讨论】:
比起尝试“清理”通用可重用单元格,我更喜欢这个。将第二个 UITableViewCell 添加到表中,给它自己的标识符,当调用 get-cell-for-row 时,如果 row == 3,则返回此单元格。这样,该单元格仅用于第 3 行。需要如果要在代码而不是情节提要中添加开关,请注意不要多次添加开关对象。【参考方案2】:UITableView 进行了高度优化,其中一项主要优化是尽可能重用表格单元格对象。这意味着表格行和 UITableViewCell 对象之间没有永久的一对一映射。
因此,单元格对象的同一个实例可以重复用于多行。一旦单元格的行滚动到屏幕外,该行的单元格就会进入“回收”堆,并且可能会被重新用于屏幕上的另一个行。
通过创建 Switch 对象并将它们添加到单元格中,每次第三行出现在屏幕上时,您都会再次将其添加到任何 Cell 对象中,表格恰好为第 3 行“出列”。
如果您要向可重复使用的单元格添加内容,则必须具有相应的代码,以便在将单元格重新用于另一个表格行时将其重置为默认值。
【讨论】:
【参考方案3】:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
FormCell *cell = (FormCell *) [tableView dequeueReusableCellWithIdentifier: @"FormCell"];
if(cell == nil)
cell = [[FormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FormCell"];
else
for (UIView *subview in [cell subviews])
[subview removeFromSuperview];
if(indexPath.row == 3)
UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(100, 9, 50, 50)];
[mySwitch addTarget: self action: @selector(flip:) forControlEvents:UIControlEventValueChanged];
[cell.contentView addSubview:mySwitch];
[[UISwitch appearance] setOnTintColor:[UIColor colorWithRed:163.0/255.0 green:12.0/255.0 blue:17.0/255.0 alpha:1.0]];
return cell;
这不会复制表格滚动上的 UISwitch
另一种方法是将reuseIdentifier
设置为nil
。
希望这会有所帮助。
【讨论】:
以上是关于将 UISwitch 添加到 TableView 中的一个单元格的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式将约束添加到tableView单元格的默认textLabel和accessoryView
在 TableViewCell 中保持 UISwitch 的状态:Swift
addTarget:action:forControlEvents - TableView 中的 UISwitch - 发送方正常,事件始终为 0x0