UIPickerView mit "externer" DataSource und Delegate in Swift

8

Ich habe zwei verschiedene UIPickerViews in meiner Ansicht. Sie funktionieren großartig, wenn ich die dataSource und den Delegaten auf die View setze, in der sie über das Storyboard gehostet werden, aber wenn ich versuche, das über Code wie unten beschrieben zu tun, funktioniert es nicht.

Beide Picker müssen verschiedene Daten haben, um sie anzuzeigen (und möglicherweise sogar unterschiedliche Verhaltensweisen für den Delegierten). Daher möchte ich sie programmatisch mit verschiedenen Datenquellen verbinden.

Ich habe versucht, eine eigene Klasse zu erstellen, die die UIPickerViewDataSource- und UIPickerViewDelegate-Protokolle implementiert und Objekte dieser Klasse mit meinen PickerViews verbindet, aber es funktioniert nicht. Zur Laufzeit wird eine Ausnahme ausgelöst: terminating with uncaught exception of type NSException :

%Vor%

Wie kann ich das zum Laufen bringen? Was habe ich verpasst? Hier ist mein Code:

WeightWheelController.swift

%Vor%

WeightWheelInputViewController.swift

%Vor%

KURZ UPDATE:

In dieser Frage habe ich festgestellt, dass Sie verschiedene Tags für verschiedene Picker-Ansichten verwenden können. Das wäre eine Option; Trotzdem mag ich es nicht. Ich möchte lieber einen MVC-Ansatz verfolgen und verschiedene Controller an jeden Picker anschließen. Ist das nicht möglich?

    
Christian 09.01.2015, 17:05
quelle

1 Antwort

13

Sowohl delegate als auch datasource sind nicht zugeordnete Referenzen. Dies bedeutet, dass c1 und c2 freigegeben werden, sobald Sie den Gültigkeitsbereich verlassen. Versuchen Sie, c1 und c2 als Eigenschaften der Klasse zu deklarieren.

Ungenannte Referenzen erzeugen keine starke Kontrolle über das Objekt, auf das verwiesen wird (a.k.a.. erhöhen sie nicht die Retain-Anzahl, um ARC daran zu hindern, das referenzierte Objekt aufzuheben).

Stellen Sie außerdem sicher, dass Sie die Eigenschaften delegate und data source der PickerViews vom Interface Builder entfernen.

%Vor%     
rakeshbs 09.01.2015, 17:48
quelle