Подзаголовок UITextField для UITableViewCell, получить индексную ячейку ячейки
Я добавил UITextField
как подпункт UITableViewCell
. Затем я добавил target
и selector
, чтобы я мог знать, когда UIControlEventEditingChanged
. Это отлично работает, но я бы хотел, чтобы вы знали indexPath
ячейки, в которой находится UITextField
, поскольку она может быть добавлена в любое количество ячеек.
Возможно ли это? В принципе, я хочу найти родительский вид, который является UITableViewCell
.
Ответы
Ответ 1
Вызовите [UIView superview]
в поле, чтобы получить ячейку, в которой он находится, затем вызовите [UITableView indexPathForCell:]
в ячейке, чтобы получить индексный путь.
UPDATE: на iOS 7 вам нужно также вызвать супервизор на этом представлении (дополнительный уровень просмотров); здесь категория в 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
Ответ 2
Вместо того, чтобы рекурсивно пытаться найти супервизор, существует более простое решение:
Swift
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)
}
Objective-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 для горячего сердца
Ответ 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;
}
Ответ 4
Я хотел бы поделиться кодом @Ertebolle
в swift -
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
}
}