Tag: 键值观察

iOS WatchKit – 将关键值观察者添加到NSUserDefaults崩溃

我正在尝试添加将数据从iPhone发送到Watch的function。 我已经设置了应用程序组,并且一切运行顺利,但是当我尝试在Watch扩展文件中添加观察者到NSUserDefaults时,应用程序在启动时总是崩溃。 (是的,我已经validation了应用程序组名称是正确的,并在所有目标function中进行了检查,并且所有预configurationconfiguration文件都是最新的,并启用了应用程序组) 码: override func willActivate() { super.willActivate() NSUserDefaults(suiteName: "my.suite.name")?.addObserver(self, forKeyPath: "phoneSaysHello", options: NSKeyValueObservingOptions.New, context: nil) } override func didDeactivate() { super.didDeactivate() // Remove listener for commands sent from phone NSUserDefaults(suiteName: "my.suite.name")?.removeObserver(self, forKeyPath: "phoneSaysHello", context: nil) } 错误: ***由于未捕获exception“NSInternalInconsistencyException”,原因:终止应用程序NSUserDefaults类的一个实例0x7f99534559b0被释放,而键值观察员仍然注册。 当前观察信息:(上下文:0x0,属性:0x7f9953609200>)'

UIWindow RootViewController更改SWIFT时触发事件/方法

我正在研究一个iOS框架。 我有一个要求,当用户进入或退出一个特定的视图控制器时logging事件。 为此,我想如果以某种方式我可以注册通知来触发一个自定义的方法,当根视图控制器改变。 或者也许使用KVO。 但我不明白如何从实施的angular度来做这件事,因为我找不到任何这样的通知。 任何在这方面的帮助将不胜感激。 谢谢。 请注意,这是一个框架项目。 所以这个框架是build立的,然后添加/embedded到另一个应用程序。 我没有关于该应用程序中的视图控制器的任何信息。 我唯一可以访问的是UIWindow的根视图控制器。 所以,我需要知道什么时候发生变化。

通知不会导致dealloc被调用

我想在一个项目中使用这个: https : //github.com/zakkhoyt/VWWPermissionKit 我不太了解KVO /通知中心,所以我想发表一个问题。 基本上,Permission Manager的init和dealloc如下所示: – (instancetype)init { self = [super init]; if (self) { [[NSNotificationCenter defaultCenter] addObserverForName:VWWPermissionNotificationsPromptAction object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { dispatch_async(dispatch_get_main_queue(), ^{ VWWPermission *permission = note.userInfo[VWWPermissionNotificationsPermissionKey]; [permission presentSystemPromtWithCompletionBlock:^{ dispatch_async(dispatch_get_main_queue(), ^{ [permission updatePermissionStatus]; if(permission.status == VWWPermissionStatusDenied){ [self.permissionsViewController displayDeniedAlertForPermission:permission]; } [self checkAllPermissionsSatisfied]; }); }]; }); }]; [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil […]

简单types(非NSObject)上的KVO(IOS 5)

我有问题,使IOS(Objective-C)KVO工作的键typesint。 我的类声明了一个inttypes的属性sampleValue 。 由于int不会自动实现KVOfunction,我已经自动忽略了方法NotNotifyObserversforKey: + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey { BOOL automatic = NO; if ([theKey isEqualToString:@"sampleValue"]) { automatic = NO; } else { automatic=[super automaticallyNotifiesObserversForKey:theKey]; } return automatic; } 这个方法就像我期望的那样被调用。 我也已经实现了像这样的sampleValue属性的setter方法: – (void) setSampleValue:(int)newSampleValue { [self willChangeValueForKey:@"sampleValue"]; sampleValue = newSampleValue; [self didChangeValueForKey:@"sampleValue"]; } 在观察者类中设置观察者是这样完成的(dc是观察对象的实例): [dc addObserver:self forKeyPath:@"sampleValue" options:NSKeyValueObservingOptionNew context:NULL]; 但是,更新sampleValue时,不会向我的观察者对象发送通知。 更新NSDatetypes的另一个属性绝对没问题。 任何人都可以帮我弄清楚我做错了什么,或者我应该怎么做才能做到这一点。 最好的问候Tomo

通过KVO观察MKMapView的区域?

我有一个对象,有兴趣知道什么时候MKMapView的区域被改变。 但是,该对象不是地图视图的代表。 我正在尝试以下,其中map是一个MKMapView: [map addObserver:self forKeyPath:@"region" options:0 context:nil]; 但是, observeValueForKeyPath:ofObject:change:context:没有被callback。 作为临时解决scheme,我有地图的委托让这个其他对象知道什么时候地图区域被更改,但我想解耦这两个对象,因为它们并不真正相关。

什么时候应该从closures的ViewController类中观察持续的Model类调用removeObserver:forKeyPath?

我有一个ViewController类,它有一个属性,我想在模型更改上观察属性。 在我的模型对象中,我有一个在我的应用程序的背景中定期更新的属性。 随着更新,我需要在我的ViewController执行代码。 为此,我在ViewController viewDidLoad方法中创build了一个观察者模型。 [ModelObject addObserver:self forKeyPath:@"State" options:NSKeyValueObservingOptionNew context:nil]; 正如你所看到的,这没有什么特别的,观察方法的行为,只要我离开我的屏幕上显示的视图。 如果我从父视图中删除上述视图,当我的ModelObject实例Mode属性更改时,我得到一个EXC_BAD_ACCESS错误消息。 具体来说,我的应用程序在更新Mode属性的行上崩溃,并且我在ModelObject实例内的以下代码行上收到最没用的EXC_BAD_ACCESS。 //This is located in a method that periodically toggles the value of "State" [self setState: 2]; 我会假设这个问题的解决scheme是从我的ViewController某个地方调用[ModelObject removeObserver: self forKeyPath:@"State"] ,当它从它的父级子视图数组中移除时。 不过,我在viewDidUnload方法中添加了一行代码,但是我发现viewDidUnload方法没有被调用。 我不确定这是否是正确的地方,但它需要去哪里。 我可能做错了什么? 我知道问题是KVO相关,因为如果我删除了观察,应用程序工作没有任何问题。 我的模型实例可以根据需要切换这个值,我的应用程序也不会崩溃。 我应该怎么做才能确保观察视图从其父视图的子视图中被移除时,我的观察者被正确地移除了?

UITextField initWithFrame上的KVO崩溃

我的应用程序的客户发给我这个奇怪的崩溃报告,我无法弄清楚这会如何崩溃。 我不能自己重现这个问题,所以我依靠崩溃报告。 它崩溃在以下非常简单的代码行: UITextField *value = [[UITextField alloc] initWithFrame:frame]; 崩溃似乎与键值观察(KVO)有关,但我在这里没有做任何事情。 这是一个简单的构造函数! 唯一可能的情况是,另一个线程正在写入一个dealloc'ed对象,该对象和initWithFrame:创build的对象具有相同的内存地址initWithFrame: 。 但在崩溃报告中,所有其他线程都很安静。 我发现了其他类似的问题,但他们都没有答案。 有任何想法吗? 这里是崩溃报告的相关部分: Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000010 Triggered by Thread: 0 Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libobjc.A.dylib 0x0000000181981b90 objc_msgSend + 16 1 Foundation 0x0000000182bf2454 -[NSObject(NSKeyValueObserverNotification) willChangeValueForKey:] + 324 2 QuartzCore 0x0000000184deb11c […]

观察NSArray中NSDictionary的值更改

这是我的NSArray carType ( { isSelected = 0; kFieldName = "All types"; kObjectValue = 0; kObjectValueText = All; }, { isSelected = 0; kFieldName = "4 seats"; kObjectValue = 4; kObjectValueText = "4 seats"; }, { isSelected = 1; kFieldName = "7 seats"; kObjectValue = 7; kObjectValueText = "7 seats"; } ) 我如何观察isSelected字段的变化? 我在我的代码中使用了KVO,但它不起作用。 carType是context的NSArray属性 – […]

当我触摸tabbar项目时,我没有收到任何通知

我有UITabbarCoo = ntroller应用程序。 我添加了一个观察者,我正在等待任何通知。 当我触摸tabbar项目时,我没有收到任何通知。 [self.tabBarController addObserver:self forKeyPath:@"selectedIndex" options:NSKeyValueObservingOptionNew context:@"changedTabbarIndex"]; – (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSString *action = (NSString*)context; if([action isEqualToString:@"changedTabbarIndex"]) { } }

一对多的KVO,但传递到observeValueForKeyPath的NSNull对象

我有一个托pipe对象与成员类的一对多关系。 当我添加成员的观察员,它的工作。 当一个新成员添加到关系中时,将使用新对象调用observeValueForKeyPath,并且更改字典包含新成员对象。 但是,obserValueForKeyPath将被第二次触发,所有值为nil并且改变字典new =“NULL”。 什么是第二个触发器? 我设置了一个断点,但不知道谁是触发器。 @interface FooObject : NSManagedObject {} @property (nonatomic, strong) NSString *fooId; @property (nonatomic, strong) NSSet* members; @end @implementation FooObject @dynamic fooId; @dynamic members; – (NSMutableSet*)membersSet { [self willAccessValueForKey:@"members"]; NSMutableSet *result = (NSMutableSet*)[self mutableSetValueForKey:@"members"]; [self didAccessValueForKey:@"members"]; return result; } – (void)registerObservers { [self addObserver:self forKeyPath:@"members" options:NSKeyValueObservingOptionNew context:nil]; } – (void)unregisterObservers […]