2017-02-05 3 views
0

Meine App wurde kürzlich veröffentlicht, aber es unterstützt iOS 8.2.Segmentierte Steuerung addTarget() Absturz-App unter iOS 9.0

Unter iOS 9.0 stürzt das Tippen auf ein segmentiertes Steuerelement, das programmgesteuert hinzugefügt wurde, leider die App ab, ohne dass eine Fehlermeldung in der Konsole angezeigt wird.

Ich glaube, dass die Linie, wo das Ziel hinzugefügt wird, kann das Problem verursachen:

Die folgende Zeile in der init gesetzt wird() meine benutzerdefinierte Zelle, die segmentierte Kontrolle ist eine Instanz var und ruft eine Methode in seine übergeordnete Ansicht Controller

segmentedControl.addTarget(ListViewController(), action: #selector(ListViewController.segmentedControlToggled(segmentedControl:)), for: .valueChanged) 

Auch dies funktioniert wie erwartet bis iOS 9.0.

Das Setup funktioniert gut, es stürzt nur ab, wenn das segmentierte Steuerelement angetippt wird.

Sollte es eine andere Syntax für den Selektor geben?

Vielen Dank für Anregungen!

Antwort

2

Per Dokumentation von addTarget:

Die Steuerung behält nicht das Objekt im Zielparameter. Es liegt in Ihrer Verantwortung, einen starken Verweis auf das Zielobjekt beizubehalten, während es an ein Steuerelement angehängt ist.

Was bedeutet, dass Sie den Wert des target Parameter irgendwo, was Sie speichern müssen nicht erreichen:

segmentedControl.addTarget(ListViewController(),...) 

Die ListViewController wird wie erhalten ausgeplant Kürze wird es keine anderen Verweise sein Das Wichtigste, an das Sie sich erinnern sollten, ist, dass Sie nicht im Voraus wissen können, wann die Freigabe erfolgt, da Sie nicht wissen, wie sich andere Objekte auf Ihr Objekt beziehen können. Um sicherzustellen, dass das Ziel nicht freigegeben wird, speichern Sie die ListViewController Instanz in einer Eigenschaft.

Der Absturz ist nicht speziell auf die iOS-Version, es könnte sein, dass auf einigen iOS-Version die ListViewController früher freigegeben wird.

+0

Vielen Dank, Cristik, das habe ich übersehen. Ich habe es geändert und es hat das Problem behoben! Ich bin jedoch immer noch verwirrt darüber, warum dies in jeder Version über 8.4 funktioniert, aber nicht darunter. – nontomatic

+1

@nontomatic Es kann sein, dass das Ziel von anderen Objekten gefangen (beibehalten) wird, die es indirekt am Leben erhalten. Und iOS 8.3 und darunter haben diese Objekte nicht. Grundsätzlich funktioniert Ihre App in 8,4 und höher aufgrund einiger Implementierungsdetails von UIKit, aber da diese außerhalb Ihrer Kontrolle liegen, behalten Sie besser eine starke Referenz für sich. – Cristik

+0

Danke für das Follow-up, das macht Sinn, danke! – nontomatic

Verwandte Themen