如果我在每个表格视图单元格中添加一个 UISwitch 控件,我如何知道它属于哪个单元格?

Posted

技术标签:

【中文标题】如果我在每个表格视图单元格中添加一个 UISwitch 控件,我如何知道它属于哪个单元格?【英文标题】:If I add a UISwitch control to each of my table view cells, how can I tell which cell it belongs to? 【发布时间】:2010-08-11 20:23:13 【问题描述】:

我有一个UITableView,其中的单元格包含UISwitch 控件。它类似于下面显示的 iPhone 时钟应用程序中的表格视图...

(来源:epicself.com)

在我的应用程序的cellForRowAtIndexPath 方法中,我像这样创建并附加UISwitch 控件...

 CGRect frameSwitch = CGRectMake(215.0, 10.0, 94.0, 27.0);
 UISwitch *switchEnabled = [[UISwitch alloc] initWithFrame:frameSwitch];
 [switchEnabled addTarget:self action:@selector(switchToggled:) forControlEvents:UIControlEventValueChanged];

 cell.accessoryView = switchEnabled;

我的问题是,当用户切换开关并调用switchToggled 方法时,我如何判断它属于哪个表格单元格?如果不知道它的上下文,我真的不能用它做很多事情。

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

在您的操作方法中,您可以将传入的UISwitch(即UITableViewCell 本身)的superview 转换为,然后将其传递给tableViewindexPathForCell 方法。

indexPathForCell 将返回一个 NSIndexPath 对象,然后您可以使用它来索引您的数据模型以进行修改。那么你所要做的就是在你的tableView 上拨打reloadData

另外,在cellForRowAtIndexPath 中,您应该根据您的模型设置UISwitch 的状态。

【讨论】:

这实际上是一个更好的方法,因为它不会用完标签属性,这通常是一件好事,谢谢! 只是对于那些仍然发现superview有问题的人,有时您需要指向控件的superview的superview,因为控件可能在UITableViewCellContentView中。 UITableViewCellContentView 的超级视图将是所需的 UITableViewCell【参考方案2】:

首先,修复内存泄漏:

UISwitch *switchEnabled = [[[UISwitch alloc] initWithFrame:frameSwitch] autorelease];

然后选择以下选项之一:

switchEnabled.tag = someInt; // before adding it to the cell

NSLog(@"switched %d",switch.tag); // to see which switch was toggled

UITableViewCell *parentCell = switchEnabled.superview;
// + some magic to see which cell this actually is

【讨论】:

+1 表示.tag。这是最简单的方法。将其与索引一起加载到您要从中填充表的数据数组中。 谢谢,MV! tag 属性会做得很好!没有泄漏,我只是忘了在问题中包含我的发布电话。

以上是关于如果我在每个表格视图单元格中添加一个 UISwitch 控件,我如何知道它属于哪个单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何在展开它们的同时在表格视图单元格中添加子视图并对它们的子视图元素执行操作?

将手势识别器添加到表格单元格中的图像视图

在表格视图单元格中添加集合视图 swift 3

以编程方式开始在另一个表格视图单元格中编辑 UITextField

自定义表格视图单元格中特定元素的手势

表格视图按钮索引单元格