如何在基于 table 视图的部分中获取单元格在切换更改事件时的索引路径
How can I get index path of cell on switch change event in section based table view
我有自定义单元格,在右侧的几个单元格中有开关。我想要的是在开关更改事件中存储特定单元格的值。 Table 视图有多个部分,所以我无法为开关设置标签,因为我需要部分和行来获取索引路径。
有任何替代方案的建议,但我必须在基于 table 视图的部分中使用 UISwitch。
谢谢
在您的自定义单元格中添加属性以帮助您识别单元格所代表的信息。索引路径、数据模型的索引等...
然后向单元格添加一个块 属性,当单元格开关发生变化时,您可以调用它来通知 UITableView 或任何其他代码段。例如
@property (nonatomic,copy) void (^onSwitchChange)(UITableViewCell *cell);
在您的自定义单元格代码中,为 UISwitch 添加一个操作处理程序。当它触发时,调用 self.onSwitchChange(self) 它将通知注册了一个 onSwitchChange 块的代码开关已经改变以及在哪个单元格上。
在您创建单元格时的 table 视图中,按如下方式设置 onSwitchChange 块:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath *)indexPath
{
<snip>
YourUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:yourCellIdentifier forIndexPath:indexPath];
cell.onSwitchChange=^(UITableViewCell *cellAffected){
// Add code to deal with the swicth switch using properties of cellAffected
... Your handler code here ...
}];
<snip>
}
这使您可以处理 table 视图控制器中的所有更改。希望这有帮助。
如果您对最大部分中的最大行数有所了解,即使您有部分,您仍然可以创建标签。例如,如果您认为一个部分中会有 1000 行,那么您可以使用以下公式创建标签。
tag = section * 1000 + row;
稍后在 switch 的 IBAction 中,您可以使用以下方法找出索引路径(部分和行):
section = tag/1000;
row = tag%1000;
如果您不知道您的部分有多少行,您可以使用 sender.superview.superview
找出单元格(如果在层次结构中添加了任何其他视图,请小心)。
Rory McKinnel 的 仍然是您问题的最干净的解决方案。
@Jageen 的回答有效。我必须找出单元格是哪个超级视图,我的高一级。
UITableViewCell *cell = (UITableViewCell*)[sender superview].superview.superview;
NSIndexPath *indexPath = [self.myTableView indexPathForCell:cell];
NSLog(@"Section %ld Row : %ld",(long)indexPath.section,(long)indexPath.row); // print row section and index
我有自定义单元格,在右侧的几个单元格中有开关。我想要的是在开关更改事件中存储特定单元格的值。 Table 视图有多个部分,所以我无法为开关设置标签,因为我需要部分和行来获取索引路径。
有任何替代方案的建议,但我必须在基于 table 视图的部分中使用 UISwitch。
谢谢
在您的自定义单元格中添加属性以帮助您识别单元格所代表的信息。索引路径、数据模型的索引等...
然后向单元格添加一个块 属性,当单元格开关发生变化时,您可以调用它来通知 UITableView 或任何其他代码段。例如
@property (nonatomic,copy) void (^onSwitchChange)(UITableViewCell *cell);
在您的自定义单元格代码中,为 UISwitch 添加一个操作处理程序。当它触发时,调用 self.onSwitchChange(self) 它将通知注册了一个 onSwitchChange 块的代码开关已经改变以及在哪个单元格上。
在您创建单元格时的 table 视图中,按如下方式设置 onSwitchChange 块:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath *)indexPath
{
<snip>
YourUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:yourCellIdentifier forIndexPath:indexPath];
cell.onSwitchChange=^(UITableViewCell *cellAffected){
// Add code to deal with the swicth switch using properties of cellAffected
... Your handler code here ...
}];
<snip>
}
这使您可以处理 table 视图控制器中的所有更改。希望这有帮助。
如果您对最大部分中的最大行数有所了解,即使您有部分,您仍然可以创建标签。例如,如果您认为一个部分中会有 1000 行,那么您可以使用以下公式创建标签。
tag = section * 1000 + row;
稍后在 switch 的 IBAction 中,您可以使用以下方法找出索引路径(部分和行):
section = tag/1000;
row = tag%1000;
如果您不知道您的部分有多少行,您可以使用 sender.superview.superview
找出单元格(如果在层次结构中添加了任何其他视图,请小心)。
Rory McKinnel 的
@Jageen 的回答有效。我必须找出单元格是哪个超级视图,我的高一级。
UITableViewCell *cell = (UITableViewCell*)[sender superview].superview.superview;
NSIndexPath *indexPath = [self.myTableView indexPathForCell:cell];
NSLog(@"Section %ld Row : %ld",(long)indexPath.section,(long)indexPath.row); // print row section and index