【问题标题】:UITextField subview of UITableViewCell, get indexPath of cellUITableViewCell的UITextField子视图,获取cell的indexPath
【发布时间】:2012-03-23 13:25:07
【问题描述】:

我添加了UITextField 作为UITableViewCell 的子视图。然后我添加了targetselector,这样我就可以知道UIControlEventEditingChanged 的时间。这很好用,但我希望您知道UITextField 所在单元格的indexPath,因为它可以添加到任意数量的单元格中。

这可能吗?基本上我想找到UITableViewCell的父视图。

【问题讨论】:

标签: objective-c ios cocoa-touch uitableview uitextfield


【解决方案1】:

在字段上调用[UIView superview] 以获取它所在的单元格,然后在该单元格上调用[UITableView indexPathForCell:] 以获取索引路径。

更新:在 iOS 7 上,您也需要在该视图上调用 superview(额外的视图层);这是 UITableView 上的一个类别,它应该独立于 iOS 版本:

@interface UITableView (MyCoolExtension) 

- (NSIndexPath *)indexPathForCellContainingView:(UIView *)view;

@end

@implementation UITableView (MyCoolExtension)

- (NSIndexPath *)indexPathForCellContainingView:(UIView *)view {
    while (view != nil) {
        if ([view isKindOfClass:[UITableViewCell class]]) {
            return [self indexPathForCell:(UITableViewCell *)view];
        } else {
            view = [view superview];
        }
    }

    return nil;
}

@end

【讨论】:

  • 嗯,所以[UIView superview] 会返回一些东西吗?编辑:没关系,测试它并且它有效。这是完美的,非常简单!
  • 这对于不可见的单元格不起作用,因为 indexPathForCell 对于不可见的视图返回 nil
  • 是的,但如果当前正在编辑单元格,那么这可能不是问题。
  • 嗨。我在做 [self.view superview],对吗?另外,请您详细说明如何调用 [UITableView indexPathForCell:] 。我需要在 - (void)textFieldDidBeginEditing:(UITextField *)textField 中找到 indexPath
  • 很棒的类别。谢谢!!
【解决方案2】:

有一个更简单的解决方案,而不是递归地尝试找到超级视图:

斯威夫特

func indexPathForCellContainingView(view: UIView, inTableView tableView:UITableView) -> NSIndexPath? {
    let viewCenterRelativeToTableview = tableView.convertPoint(CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds)), fromView:view)
    return tableView.indexPathForRowAtPoint(viewCenterRelativeToTableview)
}

目标-C

- (NSIndexPath *)indexPathForCellContainingView:(UIView *)view inTableView:(UITableView *)tableView {
    CGPoint viewCenterRelativeToTableview = [tableView convertPoint:CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds)) fromView:view];
    NSIndexPath *cellIndexPath = [tableView indexPathForRowAtPoint:viewCenterRelativeToTableview];
    return cellIndexPath
}

我把这个变成了Gist 给 Swift 的人

【讨论】:

  • 非常感谢您提供 ObjC 和 Swift 解决方案!你的 swift 函数效果很好
  • @A_toaster 很高兴听到我帮助了某人!祝你有美好的一天:)
  • 适用于可见视图,但对于超出超级视图范围的视图则效果不佳
  • 那是因为您无法访问可见范围之外的任何单元格@AntonDuzenko 这就是为什么它返回一个可选的
【解决方案3】:

试试这个解决方案。它对我有用

   #pragma mark - Get textfield indexpath
- (NSIndexPath *)TextFieldIndexpath:(UITextField *)textField
{
    CGPoint origin = textField.frame.origin;
    CGPoint point = [textField.superview convertPoint:origin toView:self.TblView];

    NSIndexPath * indexPath = [self.TblView indexPathForRowAtPoint:point];
    NSLog(@"Indexpath = %@", indexPath);
    return indexPath;
}

【讨论】:

  • 你的答案到底有什么贡献而我的没有? :) 除了变量名之外,它的代码几乎相同(PS 在 iOS 中,我们不会将变量的首字母大写)
  • 代码不同,它使用convertPont:toView 而不是convertPoint:fromView。也许你在傲慢中错过了这一点。 #不好
【解决方案4】:

我想在 swift 中分享@Ertebolle 代码 -

extension UITableView
{
    func indexPathForCellContainingView(view1:UIView?)->NSIndexPath?
    {
        var view = view1;
        while view != nil {
            if (view?.isKindOfClass(UITableViewCell) == true)
            {
                return self.indexPathForCell(view as! UITableViewCell)!
            }
            else
            {
                view = view?.superview;
            }
        }
        return nil
    }
}

【讨论】:

    【解决方案5】:

    斯威夫特 4/5

    func indexPathForCellContainingView(view: UIView,
                                        inTableView tableView:UITableView) -> IndexPath? {
        let viewCenterRelativeToTableview =
            tableView.convert(CGPoint(x: view.bounds.midX, y: view.bounds.midY), to: view)
        return tableView.indexPathForRow(at: viewCenterRelativeToTableview)
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-20
      • 2012-10-24
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多