2016-09-26 33 views
3

Swift 3の移行後、本当に変わったことが起こっています。 2つのビューコントローラがあり、どちらもUITableViewDelegateを実装しており、両方とも実装していますpublic func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)Xcode 8/Swift 3:didSelectRowAtとdidSelectRowAtIndexPath

実際のメソッドが呼び出されます。

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)からpublic func tableView(_ tableView: UITableView, didSelectRowAtIndexPath: IndexPath)に変更した場合(Swift 2.2の署名に気付いた場合)、両方とも動作します。

両方のビューコントローラはSwiftクラスなので、何が起こっているのかわかりません。 私はそれがObjective-CとSwiftの相互運用性の問題であろうと確信していますが、私たちのプロジェクト全体がSwiftで書かれているので、何が原因であるか把握するのは難しいのです。

何か助けていただければ幸いです。 ありがとうございます。

+0

を使うのか? Swift 3では削除されています。 '' 'didSelectRowAt'''しか使用できません。 –

+0

Swift 2.2のように宣言されていて、うまくコンパイルされます。 – Cosmin

+0

いくつかのcollectionViewデリゲート関数にも同様の問題がありました。すべてがうまくいっても動作しませんでした。機能していない関数をコメントアウトし、XCodeの自動補完を使って関数を再び追加したところ、うまくいきました。ちょうど両方の関数の間に誤字がないことを言及しています.....私は古い関数のコードをコピーして貼り付けました。新しいものとボイラー...それはおそらく助けになる –

答えて

1

同様の問題が発生しました。私の問題は、UITableViewDelegateとUITableViewDataSourceのプロトコルを採用したスーパークラスを持つことと、実際のメソッドをサブクラスに実装することによって発生しました。

私が収集するのは、UITableViewDelegateとUITableViewDataSourceがobjective-cプロトコルであるため、これらの関数を実装するクラスによって直接採用されなければならないということです。さもなければ、Swift関数のシグネチャはobjective-c関数のシグネチャに正しくマッピングされません(なぜそうであるのかわかりません)。

3.0より前のSwiftバージョンでは、基本的なobjective-c関数のシグネチャがSwift UITableViewDelegateおよびUITableViewDataSourceプロトコルのシグネチャと一致しました。したがって、3.0より前では、スーパークラスにこれらのプロトコルを採用させてもうまく動作しているようです。しかしSwift 3.0の時点では、これらの署名はもはや一致しません。新しいスタイルの署名を基礎となるobjective-cの署名に適切にマッピングさせるには、クラスがUITableViewDelegateとUITableViewDataSourceプロトコルを直接採用する必要があります。

したがって、Swift 3.0以降では、UITableViewDelegateおよびUITableViewDataSourceプロトコルを直接採用しない場合、関数シグネチャは関数が正しく呼び出されるように、旧式の基本的なobjective-cシグネチャと一致する必要があります。スウィフト3.0用

7

、あなたは `スウィフト3で` `didSelectRowAtIndexPath```を入れましたか

override func tableView(_ tableView: UITableView, didSelectRowAt 
indexPath: IndexPath){ 

    //your code... 


} 
関連する問題