Ich möchte die Funktionalität zum Hinzufügen eines Beobachters und dessen Entfernung vom View-Controller trennen. Zur Zeit füge ich Beobachter in der viewWillAppear()
Methode hinzu und entferne den Beobachter in der viewWillDisappear()
. Jetzt möchte ich Light View-Controller haben, um den Beobachtercode von diesem View-Controller zu einer anderen Klasse zu trennen. Ich denke, ich muss eine neue Klasse erstellen und diesen Ansichtscontroller als den neuen Klassendelegaten festlegen, aber ich bin mir nicht sicher. Ich würde es sehr schätzen, wenn mir jemand helfen könnte, wie ich das mache.Separater Beobachtercode von ViewController zu einer anderen Klasse
Antwort
Was meinst du mit Beobachter? NSNotifikationsCenter? Vielleicht könnte ein Code-Schnipsel das deutlicher machen?
FWIW ... viewWillAppear() und viewWillDisappear() können mehr als einmal pro Lebensdauer der Ansicht aufgerufen werden, also denken Sie daran. In diesem Scanerio sollte es in Ordnung sein, solange sie ausgeglichen sind.
Ich normalerweise Beobachter hinzufügen/entfernen in init/dealloc (Objc-C) oder init/deinit (Swift) und verwenden Sie isViewLoaded, um sicherzustellen, dass ich nicht die Benutzeroberfläche zu berühren, wenn es nicht da ist, aber es liegt an Ihnen, was Sie bevorzugen.
Für Ihr tatsächliches Beobachtermuster würde ich tatsächlich eine neue Klasse ausarbeiten, um die Beobachterrückrufe zu behandeln. Wenn jedoch die Antwort auf die Callbacks des Betrachters darin besteht, die Benutzeroberfläche des View-Controllers zu aktualisieren, gibt es einige Probleme bei der Trennung von Problemen. Wahrscheinlich wäre es am besten, wenn der View-Controller eine neue Klasse hochfährt, die automatisch auf die NSNotificationCenter-Ereignisse bei der Initialisierung wartet und sich selbst bei dealloc entfernt. Definieren Sie dann ein einfaches @ required-Protokoll als einen schwachen Delegaten der Klasse. Ihr View-Controller kann dieses Objekt erstellen (oder, besser für Testzwecke, bei init in die Abhängigkeit injizieren lassen), diesem Protokoll entsprechen und sich selbst als Delegierter zuweisen.
So etwas wie
@protocol MyObservable {
@required
-(void)myXYZEventDidOccur;
}
@interface MyObserver : NSObject {
-(instancetype)initWithDelegate:(id<MyObservable>)delegate;
}
@interface MyObserver()
@property (nonatomic, weak, readwrite, nullable) id<MyObservable>delegate;
}
@implementation MyObserver {
-(instancetype)initWithDelegate:(id<MyObservable)delegate {
self = [super init];
if(self == nil) { return nil; }
self.delegate = delegate;
[NSNotificationCentre defaultCentre] addObserver...];
}
-(void)dealloc {
[NSNotificationCentre defaultCentre] removeObserver...];
}
-(void)didReceiveNotificationXYZ:(NSNotification *)notification {
[self.delegate myXYZEventDidOccur];
}
}
wirklich intelligent zu erhalten, kann man nicht einmal die Mühe zu beobachten, bis Sie einen Delegaten festgelegt haben. Ebenso, hör auf zu beobachten, wenn es keinen Delegierten gibt.
- 1. C# Klasse ID von einer Klasse zu einer anderen hinzufügen
- 2. Abrufen von Zeichenfolgenwerten aus einer anderen Klasse
- 3. Zugriff IBOutlet von einer anderen Klasse
- 4. Control vars/IBOutlets von einem ViewController in einem anderen ViewController
- 5. Viewcontroller kann nicht zu einer anderen Ansicht wechseln?
- 6. Einbetten von ViewController in einen anderen ViewController im Storyboard
- 7. Rückrufe von einer anderen Klasse
- 8. eine IBOutlet von einer anderen Klasse schnellen
- 9. Variabler Wechsel zu einem anderen ViewController
- 10. Aufruf einer anderen Methode zu einer anderen Klasse
- 11. Aufruf einer Klassenfunktion von einer anderen Klasse
- 12. Passing Daten von tableviewcell zu einem anderen Viewcontroller
- 13. Zugriff auf Instanzvariablen von einer Klasse innerhalb einer anderen Klasse
- 14. Wie rufe ich in einer Schnellverbindung zu einer Nebenstelle von einem anderen Viewcontroller auf?
- 15. Aufrufmethode von einem anderen ViewController | Swift
- 16. set uiimage für uiimageview von anderen viewcontroller
- 17. Aufruf Methode von einem anderen ViewController
- 18. Segue zu einem ViewController von nicht-Storyboard ViewController
- 19. Getter von einer anderen Klasse in einer Klasse aufrufen
- 20. getResource() einer anderen Klasse
- 21. Wie verschiebe ich ausgewählte Elemente von einer Jlist zu einer anderen Jlist in einer anderen Klasse
- 22. Wie man Variablen von einer Klasse zu einer ArrayList in einer anderen Klasse bekommt
- 23. Erweitern von C# -Code mit separater Assembly
- 24. Hinzufügen von UITableView zu ViewController
- 25. Java-Effizienz von bewegten Methoden zu einer anderen Klasse
- 26. Versucht, eine Varible von einer anderen Klasse zu bekommen
- 27. Kann ich anderen Baugruppen verbieten, von einer Klasse zu erben?
- 28. übergeben Var von einer Javascript-Klasse zu einem anderen
- 29. UITesting, XCTest aktuelle ViewController Klasse
- 30. JavaFX-Anwendung von einer anderen Klasse starten
Ja, NSNotificationCenter. Ich verstehe, dass Beobachter beim Aufruf von viewWillAppear() oder ViewWillDisappear() erstellt und freigegeben werden. Dadurch kann ich die Erinnerung für den Betrachter freigeben, wenn ich aus der Sichtweite komme. Und kann die Dealloc() nicht verwendet werden, wenn ARC aktiviert ist. –
Dealloc ist in einer ARC-Welt vollkommen legitim, aber die Art und Weise, wie Sie es verwenden, wird subtil geändert. Weitere Informationen finden Sie unter [dealloc] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/instm/NSObject/dealloc) im Grunde, verwenden Sie es nicht für die Verwaltung begrenzter Ressourcen und rufen Sie nicht super. – Michael
Können Sie beschreiben, in welchen Situationen viewWillDisappear() und viewWillAppear() den Code bricht. Ich habe einige Links überprüft, die vorgeschlagen haben, diese Methoden zum Hinzufügen oder Entfernen des Beobachters zu verwenden. Siehe hier: [Link1] (http://www.daveoncode.com/2011/12/12/quick-ios-tip-where-is-the-right-place-to-add-and-remove-observers-in -uiviewcontrollers /), [Link2] (http://stackoverflow.com/questions/10631375/whats-the-better-way-to-addobserver-removeobserver-with-nsnotificationcenter). –