我正在尝试观察AppDelegate的属性以更新tableview。这有点复杂,所以这是我的一些代码。
我想在更新数组时更新UITableView的内容。我觉得有一种更有效的方法可以做到这一点,但似乎无法弄明白。我在网上阅读了Apple的文档并且有点困惑。提前谢谢! :)
//Game.h
@interface Game: NSObject
@property (strong,nonatomic) NSMutableArray *myArray;
@end
//AppDelegate.h
#import "Game.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong,nonatomic) Game *myGame;
@end
//ViewController.m
#import "AppDelegate.h"
@implementation ViewController
//...
- (void)viewDidLoad
{
[(AppDelegate*)[[UIApplication sharedApplication] delegate] addObserver:self forKeyPath:@"myGame" options:0 context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
//THIS METHOD NEVER GETS CALLED
NSLog(@"change observed");
[self.tableView reloadData];
}
- (void)dealloc
{
[(AppDelegate*)[[UIApplication sharedApplication] delegate] removeObserver:self forKeyPath:@"myGame"];
}
//...
@end
答案 0 :(得分:0)
更新:
我建议您让视图控制器在数据模型的setter中订阅通知。它将方便地将订阅 - 取消订阅保存在一个地方:
- (void)setDataModel:(YourDataModelClass*)dataModel
{
[_dataModel removeObserver:self forKeyPath:@"myGame" context:nil];
_dataModel = dataModel; // I hope you use ARC, otherwise check if the pointers are different.
if (_dataModel != nil)
[_dataModel addObserver:self forKeyPath:@"myGame" options:0 context:nil];
}
- (void)dataModelDidUpdate
{
[self.tableView reloadData];
}
- (void)dealloc
{
self.dataModel = nil; //An easy way to unsubscribe
}
视图控制器的所有者负责在创建时和更改时设置正确的数据模型。