web-dev-qa-db-ja.com

indexPathForCellはios7以降nilを返します

私のアプリはios6.1で正常に実行されていました。 ios7シミュレーターを試しましたが、次の部分が機能しません。

EditingCell *cell = (EditingCell*) [[textField superview] superview];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
NSLog(@"the section is %d and row is %d", indexPath.section, indexPath.row);
NSUInteger section = [indexPath section];
NSUInteger row = [indexPath row];
NSString *rowKey = [[keysForRows objectAtIndex: section] objectAtIndex: row];

それは常に来る:

the section is 0 and row is 0

別のセクション/行が選択されましたが。なぜこれがios7で機能しないのか誰かが考えていますか?

18
Ludwig Meier

テキストフィールドの「囲んでいる」テーブルビューセルを見つけるアプローチは、固定ビュー階層(iOS6とiOS7の間で変更されているように見える)を想定しているため、脆弱です。

考えられる解決策の1つは、テーブルビューセルが見つかるまでビュー階層を上に移動することです。

UIView *view = textField;
while (view != nil && ![view isKindOfClass:[UITableViewCell class]]) {
    view = [view superview];
}
EditingCell *cell = (EditingCell *)view;

完全に異なりますが、よく使用される方法は、テキストフィールドに行番号を「タグ付け」することです。

cell.textField.tag = indexPath.row;   // in cellForRowAtIndexPath

次に、テキストフィールドのデリゲートメソッドでそのタグを使用します。

30
Martin R

私はあなたと同じように細胞を見つけていました。セルにボタンがあり、現在のテーブルビューがわかっている場合は、このクイックメソッドを使用します。テーブルビューセルが返されます。

-(UITableViewCell*)GetCellFromTableView:(UITableView*)tableView Sender:(id)sender {
    CGPoint pos = [sender convertPoint:CGPointZero toView:tableView];
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:pos];
    return [tableView cellForRowAtIndexPath:indexPath];
}
22
drexel sharp

IOS 11でこの問題が発生しましたが、9または10では発生しませんでしたが、@ drexel-sharpで前述した手法を使用して、func indexPath(for cell: UITableViewCell) -> IndexPath?メソッドをオーバーライドしました。

override func indexPath(for cell: UITableViewCell) -> IndexPath? {
    var indexPath = super.indexPath(for: cell)
    if indexPath == nil { // TODO: iOS 11 Bug?
        let point = cell.convert(CGPoint.zero, to: self)
        indexPath = indexPathForRow(at: point)
    }
    return indexPath
}
0
Steve