Я пытаюсь наблюдать изменения значений NSMutableArray
в объекте, написанном в ObjectiveC. Однако наблюдатель является UIViewController
, написанным в Свифте. Я не могу получить уведомления KVO. Это мои изменения:Может ли UIViewController, написанный в Swift, действовать как наблюдатель для объекта, написанного в ObjC
@interface Record : BaseObject
@property (nonatomic) NSMutableArray *commentsArray;
-(NSUInteger) countOfCommentsArray {
return _commentsArray.count;
}
-(id) objectInCommentsArrayAtIndex:(NSUInteger)index {
return [_commentsArray objectAtIndex:index];
}
-(void) insertObject:(Comment *)comment inCommentsAtIndex:(NSUInteger)index {
[_commentsArray insertObject:comment atIndex:index];
}
-(void) insertComments:(NSArray *)array atIndexes:(NSIndexSet*)indexes {
[_commentsArray insertObjects:array atIndexes:indexes];
}
-(void) removeCommentsAtIndexes:(NSIndexSet *)indexes {
[_commentsArray removeObjectsAtIndexes:indexes];
}
-(void) removeObjectFromCommentsAtIndex:(NSUInteger)index {
[_commentsArray removeObjectAtIndex:index];
}
-(void) replaceObjectInCommentsAtIndex:(NSUInteger)index withObject:(id)object {
[_commentsArray replaceObjectAtIndex:index withObject:object];
}
BaseObject происходит от NSObject
.
В моем классе Observer, который является Viewcontroller и написан в Swift, у меня есть следующее.
В одном из способов установки.
myInspectionRecord?.addObserver(self, forKeyPath: "commentsArray", options: NSKeyValueObservingOptions.New, context: nil);
У меня есть метод overrriden.
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
print("Value Changed");
}
Но почему-то, когда я добавить новый объект в массив, используя сам API, то observeValue
метод не кажется, срабатывать. Любые указатели на то, что мне здесь не хватает? Или не работает KVO между файлами Swift и Objective C?
Любая помощь будет оценена по достоинству. Спасибо!
Связанный: http://stackoverflow.com/questions/24092285/ is-key-value-monitoring-kvo-available-in-swift – kennytm
Является ли 'myInspe ctionRecord' фактически указывает на конечный объект, который вы хотите наблюдать, ко времени выполнения кода? Другими словами: поставьте точку останова на строку 'addObserver' и посмотрите, является ли' myInspectionRecord' 'nil'. Если вы назначаете эту переменную, перед ее установкой обязательно всегда регистрируйте и перерегистрируйте. – DarkDust
BTW, так как ваш класс Swift происходит от 'UIViewController' (и, следовательно, от' NSObject'), KVO отлично работает с ним. – DarkDust