Ios 如何获取观察员是否已在Swift中注册
我想在观察者运行后或视图消失时删除它。下面是代码,但有时当我想再次删除它时,观察者已经被删除了。如何检查它是否仍然注册Ios 如何获取观察员是否已在Swift中注册,ios,swift,Ios,Swift,我想在观察者运行后或视图消失时删除它。下面是代码,但有时当我想再次删除它时,观察者已经被删除了。如何检查它是否仍然注册 override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { if(!didOnce){ if(k
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if(!didOnce){
if(keyPath == "myLocation"){
location = mapView.myLocation.coordinate;
self.mapView.animateToLocation(self.location!);
self.mapView.animateToZoom(15);
didOnce = true;
self.mapView.removeObserver(self, forKeyPath: "myLocation");
}
}
}
override func viewDidAppear(animated: Bool) {
didOnce = false;
}
override func viewWillDisappear(animated: Bool) {
if(!didOnce){
self.mapView.removeObserver(self, forKeyPath: "myLocation");
didOnce = true;
}
}
override func observeValueForKeyPath(键路径:String,of对象对象:AnyObject,change:[NSObject:AnyObject],上下文:UnsafeMutablePointer){
如果(!didOnce){
如果(键路径==“myLocation”){
位置=mapView.myLocation.coordinate;
self.mapView.animateToLocation(self.location!);
self.mapView.animateToZoom(15);
didOnce=真;
self.mapView.removeObserver(self,forKeyPath:“myLocation”);
}
}
}
覆盖功能视图显示(动画:Bool){
didOnce=false;
}
覆盖功能视图将消失(动画:Bool){
如果(!didOnce){
self.mapView.removeObserver(self,forKeyPath:“myLocation”);
didOnce=真;
}
}
你走对了方向。将属性添加到类中。开始观察时将其设置为true,停止观察时将其设置为false。在所有情况下,在开始/停止观察之前检查标志,以确保您尚未处于该状态
您还可以向属性添加一个willSet方法,并让该代码在属性更改状态时开始/停止观察。主要原因:addObserver()被调用1次(在viewDidLoad或init中),但removeObserver()可以被调用2次或更多次(基于调用ViewWillEvale()的次数)
要解决此问题,请将addObserver()移动到viewWillDisplay():
private var didOnce=false
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
self.mapView.addObserver(self,forKeyPath:“myLocation”,选项:。新建,上下文:nil)
}
重写func observeValueForKeyPath(键路径:字符串,对象对象:AnyObject,更改:[NSObject:AnyObject],上下文:UnsafeMutablePointer){
如果(!didOnce){
如果(键路径==“myLocation”){
位置=mapView.myLocation.coordinate;
self.mapView.animateToLocation(self.location!);
self.mapView.animateToZoom(15);
didOnce=真;
self.mapView.removeObserver(self,forKeyPath:“myLocation”);
}
}
}
覆盖功能视图将消失(动画:Bool){
如果(!didOnce){
self.mapView.removeObserver(self,forKeyPath:“myLocation”);
didOnce=真;
}
}
private var didOnce = false
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.mapView.addObserver(self, forKeyPath: "myLocation", options: .new, context: nil)
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if(!didOnce){
if(keyPath == "myLocation"){
location = mapView.myLocation.coordinate;
self.mapView.animateToLocation(self.location!);
self.mapView.animateToZoom(15);
didOnce = true;
self.mapView.removeObserver(self, forKeyPath: "myLocation");
}
}
}
override func viewWillDisappear(animated: Bool) {
if(!didOnce){
self.mapView.removeObserver(self, forKeyPath: "myLocation");
didOnce = true;
}
}