UITextField UITableViewCell的子视图,获取单元格的indexPath

时间:2012-03-06 03:10:24

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

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

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

5 个答案:

答案 0 :(得分:21)

在字段上调用[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

答案 1 :(得分:11)

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

夫特

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心灵

答案 2 :(得分:0)

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

   #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;
}

答案 3 :(得分:0)

我想在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
    }
}

答案 4 :(得分:0)

迅速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)
}