2017-07-05 11 views
0

セルのカスタムクラス内からセルindexPathを取得しようとしています。Swift iOS:カスタムセルクラスからCellのIndexPathを取得する

私はこのようにそれを置くとき:

let indexPath :NSIndexPath = (self.superview!.superview as! UITableView).indexPath(for: self)! as NSIndexPath 

それはiOSの10デバイス上で正常に動作しますが、iOSの11シミュレータ上で、それは、私はそれを変更すると、そのため、このエラーに

Could not cast value of type 'UIView' (0x10636c5d8) to 'UITableView' 

を与えます

let indexPath :NSIndexPath = (self.superview! as! UITableView).indexPath(for: self)! as NSIndexPath 

iOS 11シミュレータでは問題なく動作しますが、iOS 10デバイスではこのエラーが発生します。

Could not cast value of type 'UITableViewWrapperView' to 'UITableView' 

iOS 10と11の両方で動作させるにはどうすればよいですか?

+1

1.セルまたはテーブルのプライベートサブビュー構造については決して想定しないでください。すべてのiOSアップデートが変更されるようです。 2.セルが独自のindexPathを知る必要があるのはなぜですか?それは悪いデザインです。 – rmaddy

+1

あなたのカスタムセルに親の 'UITableView'への弱い参照を格納してから' indexPath(for:self) 'を呼び出すのはなぜですか?例えば、 'let indexPath = self.parentTableView.indexPath(for:self)! ' –

+0

@rmaddyはそれが悪いデザインであることを知らなかった、私はメンバのテーブルとそのセルインデックスを必要とする各セルのボタンを持っているメンバーのIDに基づくアクション。 – fullMoon

答えて

0

カスタムセル内でインデックスパスを取得するのは悪い設計ですが、実行しているバージョンを確認してindexPathを取得するロジックを実装できます。

// INDEXPATH VARIABLE 
var indexPath :NSIndexPath! 

// CHECK FOR IOS 11 AND ABOVE 
if #available(iOS 11, *) { 
// CALCULATE USING TABLE VIEW 
indexPath = (self.superview! as! UITableView).indexPath(for: self)! as NSIndexPath 
} else { 
    // CALCULATE USING TABLEVIEW WRAPPER 
    indexPath = (self.superview!.superview as! UITableView).indexPath(for: self)! as NSIndexPath 
} 

希望します。

+0

ありがとうございました。これはいいアイデアでしたが、rmaddyはiOSのバージョンによってそれが変わる可能性があると述べています。ロボット猫は正しい解を提案した。 – fullMoon

+0

このコードは使用しないでください。セルのテーブルビューを取得する方がはるかに優れています。しかし、もっと重要なことは、これも実行すべきです。セルがテーブルビューまたはそのindexPathを知る必要はありません。 – rmaddy

関連する問題