Meine benutzerdefinierte UIViewController-Unterklasse verfügt über eine gespeicherte closure-Eigenschaft. Der Verschluss Signatur wird definiert als ein einziges Argument des gleichen Typs der Klasse zu nehmen:Verwechslung hinsichtlich der Verwendung von Erfassungslisten zum Vermeiden eines Referenzzyklus
class MyViewController {
var completionHandler : ((MyViewController)->(Void))?
// ...
}
... Die Idee ist, das Objekt selbst vorbei als Argument des Handlers zurück, ein wenig like the UIAlertAction initializer.
Zusätzlich und der Einfachheit halber habe ich eine Fabrik (ish) Klassenmethode:
class func presentInstance(withCompletionHandler handler:((MyViewController)->(Void)))
{
// ...
}
... das führt die folgenden Aktionen:
- Erstellt eine Instanz der Ansicht, controller,
- Weist der Eigenschaft den Beendigungshandler zu,
- Stellt es modal von dem dar, was zum Zeitpunkt des Aufrufs der Top-/Root-View-Controller ist.
My-View-Controller definitiv undicht: stelle ich einen Haltepunkt auf deinit()
, aber die Ausführung nie trifft, sogar Art und Weise, nachdem ich mit meiner Ansicht-Controller getan und es wird zurückgewiesen.
Ich bin mir nicht sicher, wie oder wo ich eine Aufnahmeliste angeben sollte, um den Zyklus zu vermeiden. Jedes Beispiel, das ich gefunden habe, scheint es dort zu platzieren, wo der Schließkörper definiert ist, aber ich kann meinen Code nicht kompilieren.
Wo deklariere ich die Verschlusseigenschaft? (wie?)
var completionHandler : ((MyViewController)->(Void))? // If so, where does it go?
Wo deklariere ich den Verschlussparameter?
class func presentInstance(withCompletionHandler handler:((MyViewController)->(Void))) { // Again, where could it go?
Wo ich die obige Funktion aufrufen und den Verschlusskörper passieren?
MyViewController.presentInstance(withCompletionHandler:{ [unowned viewController] viewController in // ... }) //^Use of unresolved identifier viewController //^Definition conflicts with previous value
Wo ich eigentlich Anruf die Schließung, in Richtung
self
? Nichts davon wird kompilieren:self.completionHandler?(unowned self) self.completionHandler?([unowned self] self) self.completionHandler?([unowned self], self)