29

我以编程方式创建了一个 UITableView 并将 UISwitch 添加到它的单元格附件视图中。

这是我在方法中的单元格附件视图中的 UISwitch 代码cellForRowAtIndexPath

UISwitch *accessorySwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
[accessorySwitch setOn:NO animated:YES];
[accessorySwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = accessorySwitch;

这是单击按钮后调用的方法。

- (void)changeSwitch:(UISwitch *)sender{

    UITableViewCell *cell = (UITableViewCell *)[sender superview];

    NSIndexPath *indexPath = [self.filterTableView indexPathForCell:cell];
    NSLog(@"%ld",(long)indexPath);

 ……………. My other code…….
}

我能够在 iOS 6 中打印索引路径值但在 iOS 7 中它打印为零,

我是否在 iOS 7 中遗漏了任何内容,或者还有其他方法可以在 iOS 7 中获取 indexPath

谢谢,阿伦。

4

9 回答 9

65

NSLog(@"%ld",(long)indexPath);错了这将打印 indexPath 的指针地址

尝试使用以下代码

CGPoint center= sender.center; 
  CGPoint rootViewPoint = [sender.superview convertPoint:center toView:self.filterTableView];
  NSIndexPath *indexPath = [self.filterTableView indexPathForRowAtPoint:rootViewPoint];
  NSLog(@"%@",indexPath);
于 2013-09-25T08:59:07.787 回答
8

Swift解决方案:像这样的 UITableView 扩展对此很有用。

extension UITableView {
    func indexPathForView(view: AnyObject) -> NSIndexPath? {
        let originInTableView = self.convertPoint(CGPointZero, fromView: (view as! UIView))
        return self.indexPathForRowAtPoint(originInTableView)
    }
}

随处使用变得容易。

let indexPath = tableView.indexPathForView(button)
于 2016-08-20T22:28:28.637 回答
6

如果单元格中有按钮。您可以通过调用 superview 来获取单元格。然后可以通过这种方式获得Indexpath。

 (void)obButtonTap:(UIButton *)sender {

    UITableViewCell *cell = (UITableViewCell *)sender.superview;
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
}
于 2013-09-25T09:13:07.063 回答
4

您可以在 cellForRowAtIndexPath 方法中为每个开关分配标签,例如

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
   UISwitch *accessorySwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
   [accessorySwitch setOn:NO animated:YES];
   [accessorySwitch addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];
   cell.accessoryView = accessorySwitch; 
   accessorySwitch.tag = indexPath.row;    
}

- (void)changeSwitch:(UISwitch *)sender{
    NSIndexPath *indexPath = [NSIndexPath indexPathWithIndex:[sender tag]];
    NSLog(@"%ld",(long)indexPath);
}
于 2013-09-25T08:58:29.787 回答
2

斯威夫特 4:

extension UITableView {
    func indexPathForView(view: AnyObject) -> NSIndexPath? {
        let originInTableView = self.convert(CGPoint.zero, from: (view as! UIView))
        return self.indexPathForRow(at: originInTableView)! as NSIndexPath
    }
}
于 2017-10-23T12:23:59.297 回答
2

SWIFT 4 Conversion,创建全球扩展:

extension UITableView {
    func indexPathForView(view: UIView) -> IndexPath? {
            let originInTableView = self.convert(CGPoint.zero, from: (view))
            return self.indexPathForRow(at: originInTableView)
        }
}

使用示例:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = ...
cell.myButton.addTarget(self, action: #selector(myButtonAction(_:)), for: .primaryActionTriggered)
return cell

    }

@objc func myButtonAction(_ button:UIButton) {

        guard let ip = self.tableView.indexPathForView(view: button) else {
            return
        }
}
于 2018-11-27T20:36:39.727 回答
1

您可能会被烧毁,假设开关superview将是tableViewCell. 也许在 iOS 7 中他们改变了层次结构以达到某种视觉效果;也许那里插入了一个新视图。

你可以继承UISwitch并给它一个indexPath属性。然后在您的cellForRowAtIndexPath, 那里分配它,以便您有参考。

于 2013-09-25T08:59:05.183 回答
0

我认为依靠按钮的位置来知道点击了哪个按钮是危险的。

我更喜欢创建一个字典,以按钮/开关本身为键,以 indexpath 为值:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
...
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    NSValue * accessorySwitchKey = [NSValue valueWithNonretainedObject:[cell settingSwitch]];
    [[self switchIndexDictionary]setObject:indexPath accessorySwitchKey];
...
}

然后当触发开关/按钮时,我很容易从我的字典中获取索引路径:

- (void)toggleSetting:(id)sender
{
    UISwitch *selectedSwitch = (UISwitch *) sender;

    NSValue * accessorySwitchKey = [NSValue valueWithNonretainedObject:selectedSwitch];
    NSIndexPath *indexPath = [[self switchIndexDictionary]objectForKey: accessorySwitchKey];
}
于 2015-03-23T16:34:39.733 回答
0

Swift5.x上测试

如果您想在单击放置在 tableViewCell 中的按钮时获取行号,那么下面的函数将起作用。

 @IBAction func buttonClickeAction(_ sender: UIButton) {
      let btnPoint = sender.convert(CGPoint.zero, to: self.tableView)
      let indexPath = self.tableView.indexPathForRow(at: btnPoint)
      print(indexPath?.row)
 }
于 2021-06-10T10:03:02.870 回答