我添加了UITextField
作为UITableViewCell
的子视图。然后我添加了target
和selector
,以便我知道何时UIControlEventEditingChanged
。这很好用,但我希望您知道indexPath
所在单元格的UITextField
,因为它可以添加到任意数量的单元格中。
这可能吗?基本上我想找到一个UITableViewCell
的父视图。
答案 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)
}
- (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)
}