web-dev-qa-db-ja.com

テーブルビューコントローラーの静的セルからメソッドを起動します

私のコードでは、ストーリーボード内に静的セルを含むテーブルがあります。最後の静的セルをクリックしたときにメソッドを起動しようとしています。

これを実現するには、コードに何を書く必要がありますか。エラーを発生させずにコード内の静的セルを参照するにはどうすればよいですか。

25
carbonr

ViewControllerに次を追加します。

@property (nonatomic, weak) IBOutlet UITableViewCell *theStaticCell;  

そのコンセントをストーリーボードのセルに接続します。

tableView:didSelectRowAtIndexPath 方法:

UITableViewCell *theCellClicked = [self.tableView cellForRowAtIndexPath:indexPath];
if (theCellClicked == theStaticCell) {
    //Do stuff
}
77
Gobot

静的セルを使用しても、- tableView:didSelectRowAtIndexPath:を実装してindexPathを確認できます。 1つのアプローチは、特定のindexPathを#defineで定義し、選択された行がそのindexPathにあるかどうかを確認し、ある場合は[self myMethod].を呼び出すことです。

9
Canopus

これが静的セルと動的セルを混合するときの私の見解です。

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
                    if let staticIndexPath = tableView.indexPathForCell(self.staticCell) where staticIndexPath == indexPath {
// ADD CODE HERE 
                }
        }

これにより、新しいセルの作成が回避されます。私たちは皆、セルを作成し、それをcellForRowAtIndexPathで構成するために使用されます

3
CiNN

CiNNの回答に続いて、これは問題を解決するSwiftバージョンです。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let staticIndexPath = tableView.indexPath(for: OUTLET_TO_YOUR_CELL), staticIndexPath == indexPath {
        // ADD CODE HERE
    }
}

このアプローチでは、特にストーリーボードで静的セルを使用している場合は、cellForRowメソッドを実装する必要はありません。

0
mourodrigo

あなたは私と同じ問題を抱えていたと思います。 tableView:didSelectRowAtをオーバーライドするとエラーが発生し続けました。その理由は、super.tableView:didSelectRowAtを呼び出すことに慣れているためですが、この場合はそうしたくありません。したがって、実行時エラーを回避するには、スーパークラスメソッドの呼び出しを削除してくださいだけです。

0