2016-09-26 11 views
3

Nach unserer Swift 3-Migration ist etwas wirklich Seltsames passiert. Wir haben zwei View-Controller, beide von ihnen implementieren UITableViewDelegate und beide implementieren public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)Xcode 8/Swift 3: didSelectRowAt vs didSelectRowAtIndexPath

Allerdings nur in einem von ihnen wird die eigentliche Methode aufgerufen.

Wenn ich in der ändern, die nicht funktioniert public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) zu public func tableView(_ tableView: UITableView, didSelectRowAtIndexPath: IndexPath) (beachten Sie die Swift 2.2 Signatur), dann funktionieren beide.

Beide View-Controller sind Swift-Klassen, also bin ich mir nicht sicher, was zum Teufel ist los. Ich bin mir ziemlich sicher, dass es ein Objective-C vs Swift Interoperabilitätsproblem sein könnte, aber unser gesamtes Projekt ist in Swift geschrieben, deshalb ist es schwer herauszufinden, was das verursacht.

Jede Hilfe wird geschätzt. Danke.

+0

Wie haben Sie setzen '' 'didSelectRowAtIndexPath''' in Swift 3? Es wird in Swift 3 entfernt. Du kannst nur '' 'didSelectRowAt''' verwenden? –

+0

Es ist wie in Swift 2.2 deklariert und es kompiliert einfach gut. – Cosmin

+0

Ich hatte ein ähnliches Problem mit einigen CollectionView-Delegatfunktionen. Obwohl alles in Ordnung war, haben sie nicht funktioniert. Nach dem Auskommentieren der nicht funktionierenden Funktionen und dem Hinzufügen der Funktionen durch die automatische XCode-Vervollständigung funktionierte es nur gut - um nur zu erwähnen, dass es zwischen beiden Funktionen keinen Tippfehler gab ... Ich habe einfach meinen Code von der alten Funktion in kopiert und eingefügt der neue und voila ... vielleicht hilft es –

Antwort

1

Ich stieß auf ein ähnliches Problem. Mein Problem wurde durch eine Oberklasse verursacht, die die Protokolle UITableViewDelegate und UITableViewDataSource anwendete und dann die tatsächlichen Methoden in einer Unterklasse implementierte.

Was ich erhalte ist, dass, weil UITableViewDelegate und UITableViewDataSource objective-c-Protokolle sind, sie direkt von der Klasse übernommen werden müssen, die diese Funktionen implementiert. Andernfalls werden die Swift-Funktionssignaturen den Funktionssignaturen von object-c nicht korrekt zugeordnet (nicht sicher, warum dies der Fall ist).

In Swift-Versionen vor 3.0 entsprachen die zugrunde liegenden objective-c-Funktionssignaturen den Signaturen in den Swift UITableViewDelegate- und UITableViewDataSource-Protokollen. Daher scheint es vor 3.0 gut zu sein, dass eine Superklasse diese Protokolle übernommen hat. Ab Swift 3.0 sind diese Signaturen jedoch nicht mehr kompatibel. Es scheint, dass Ihre Klasse die UITableViewDelegate- und UITableViewDataSource-Protokolle direkt übernehmen muss, damit die Signatur im neuen Stil der zugrunde liegenden objective-c-Signatur korrekt zugeordnet wird.

Daher müssen Sie in Swift 3.0 und höher, wenn Sie die UITableViewDelegate- und UITableViewDataSource-Protokolle nicht direkt übernehmen, die Funktionssignaturen mit den alten object-c-Signaturen vergleichen, damit Ihre Funktionen korrekt aufgerufen werden.

7

für Swift 3.0 verwenden

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

    //your code... 


} 
Verwandte Themen