79

セルから取得するにはどうすればよいindexPathですUITableViewか?

スタックオーバーフローとグーグルで検索しましたが、すべての情報が逆になっています。superView/にアクセスしUITableViewてセルを検索する方法はありますか?

コンテキストに関する詳細情報: 私が持っている 2 つのクラスがCueあります。オブジェクトはリンクされたリストにあり、ユーザーが特定のコマンドを実行すると、次の視覚的表現 ( ) を選択する必要があります。そのため、クラスはリストの次のメソッドを呼び出します。これはからを取得し、その を呼び出します。これには の が必要です。CueTableCellUITableViewCellCueTableCellCueCueCueTableCellCueCueselectCueUITableViewcellselectRowAtIndexPath:animated:scrollPosition:indexPathUITableViewCell

4

12 に答える 12

141
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

UITableView のドキュメントを読むのに役立ちますが、これが物議を醸していると見なされている場合でも (以下のコメントを参照)。

セルには、そのインデックス パスが何であるかを知る必要はありません。コントローラーには、データ モデルに基づいて UI 要素を操作するコード、または UI の対話に基づいてデータを変更するコードを含める必要があります。( MVCを参照してください。)

于 2013-03-29T21:46:08.893 に答える
25

UITableViewCell からこれを試してください:

NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];

編集:これは iOS 8.1.2 以降では機能しないようです。指摘してくれた Chris Prince に感謝します。

于 2013-11-28T20:10:10.980 に答える
11
  1. 次のように、弱い tableView プロパティをセルの .h ファイルに入れます。

    @property (weak,nonatomic)UITableView *tableView;

  2. 次のように cellForRowAtIndex メソッドでプロパティを割り当てます。

    cell.tableView = tableView;

  3. セルのindexPathが必要な場所:

    NSIndexPath *indexPath = [cell.tableView indexPathForCell:cell];

于 2015-04-23T11:21:29.513 に答える
10

「これは悪い考えだ」と言う人に対処するために、私の場合、これが必要なのは、押すUITableViewCellと別のビューへのセグエになるボタンがあることです。これはセル自体の選択ではないため、[self.tableView indexPathForSelectedRow]機能しません。

これにより、2つのオプションが残ります。

  1. ビューに渡す必要があるオブジェクトをテーブル セル自体に格納します。これは機能しますが、特にテーブルが長い場合は、すべてのオブジェクトをメモリに格納したくないNSFetchedResultsControllerため、.
  2. インデックス パスを使用して、フェッチ コントローラーからアイテムを取得します。はい、ハックして調べなければならないのは醜いようですがNSIndexPath、オブジェクトをメモリに保存するよりも最終的には費用がかかりません。

indexPathForCell:使用する正しい方法ですが、これを行う方法は次のとおりです(このコードは、のサブクラスで実装されると想定されていますUITableViewCell

// uses the indexPathForCell to return the indexPath for itself
- (NSIndexPath *)getIndexPath {
    return [[self getTableView] indexPathForCell:self];
}

// retrieve the table view from self   
- (UITableView *)getTableView {
    // get the superview of this class, note the camel-case V to differentiate
    // from the class' superview property.
    UIView *superView = self.superview;

    /*
      check to see that *superView != nil* (if it is then we've walked up the
      entire chain of views without finding a UITableView object) and whether
      the superView is a UITableView.
    */
    while (superView && ![superView isKindOfClass:[UITableView class]]) {
        superView = superView.superview;
    }

    // if superView != nil, then it means we found the UITableView that contains
    // the cell.
    if (superView) {
        // cast the object and return
        return (UITableView *)superView;
    }

    // we did not find any UITableView
    return nil;
}

PS私の実際のコードは、テーブルビューからこれらすべてにアクセスしますが、誰かがテーブルセルでこのようなことを直接したい理由の例を示しています。

于 2014-03-25T00:31:19.703 に答える
7

スイフト用

let indexPath :NSIndexPath? = (self.superview.superview as! UITableView)?.indexPathForCell(self)
于 2016-06-02T10:23:35.787 に答える
1

これを試してください(tableViewにセクションが1つしかなく、すべてのセルの高さが等しい場合にのみ機能します):

//get current cell rectangle relative to its superview
CGRect r = [self convertRect:self.frame toView:self.superview];

//get cell index
int index = r.origin.y / r.size.height;
于 2015-08-09T08:58:41.860 に答える
0

UITableViewCell からこれを試してください:

NSIndexPath *indexPath = [(UITableView *)self.superview.superview indexPathForCell:self];
于 2015-05-26T09:59:57.643 に答える
-1

スウィフト 4.x

私のセルへのアクセスを提供するために、私は次のようなことをしました:

私はUIViewの拡張機能を持っています:

extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}

そして..私のセルクラスで:

class SomeCell: UITableViewCell {

    func someMethod() {
        if let myViewController = self.parentViewController as? CarteleraTableViewController {
            let indexPath : IndexPath = (myViewController.tableView).indexPath(for: self)!
            print(indexPath)
        }
    }
}

それはすべて私を形成します。

よろしくお願いします。

于 2018-08-03T17:06:33.583 に答える