我以编程方式创建了一个UITableView,并将UISwitch添加到它的单元附件视图中。
这是我在cellForRowAtIndexPath
方法中的单元附件视图中的UISwitch代码。
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中它打印为nil,
我在iOS 7中遗漏了什么,或者在iOS 7中有其他方法来获取indexPath
谢谢, 阿伦。
答案 0 :(得分:63)
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);
答案 1 :(得分:7)
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)
答案 2 :(得分:6)
如果您在单元格中有按钮。您可以通过调用superview来获取单元格。然后可以通过这种方式获得Indexpath。
(void)obButtonTap:(UIButton *)sender {
UITableViewCell *cell = (UITableViewCell *)sender.superview;
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
}
答案 3 :(得分: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);
}
答案 4 :(得分:2)
SWIFT 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
}
}
答案 5 :(得分:1)
你可能会被烧毁,假设交换机superview
将成为tableViewCell
。也许在iOS 7中,他们改变了层次结构以实现某种视觉效果;也许有一个新视图插入其中。
您可以继承UISwitch
并为其提供indexPath
属性。然后在cellForRowAtIndexPath
中,将其分配到那里,以便您有参考。
答案 6 :(得分:1)
SWIFT 4转换,创建全局扩展:
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
}
}
答案 7 :(得分:0)
我认为依靠按钮的位置知道哪一个被点击是危险的。
我首选创建一个字典,将按钮/开关本身作为键,并将索引路径作为值:
- (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];
}
答案 8 :(得分: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)
}