我是iPhone新手。我正在尝试实施KVO机制。
我有什么?
两个带有两个UIViewController的TabController,FirstViewController有一个按钮, SecondViewController有一个UITextView
我想要什么?
当在firstViewController中按下按钮时,它会更新成员变量,应该由secondViewController观察,它应该附加到UITextView。
我做了什么?
FirstViewController.h
@interface FirstViewController : UIViewController
{
IBOutlet UIButton *submitButton;
}
-(IBAction)submitButtonPressed;
@property (retain) NSString* logString;
@end
FirstViewController.m
-(IBAction)submitButtonPressed
{
NSLog (@" Submit Button PRessed ");
self.logString = @"... BUtton PRessed and passing this information ";
}
SecondViewController.h
@interface SecondViewController : UIViewController
{
IBOutlet UITextView *logView;
}
@property (nonatomic, strong) UITextView *logView;
@end
SecondViewController.m
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
......
NSArray *vControllers = [self.tabBarController viewControllers];
FirstViewController *fvc = [vControllers objectAtIndex:0];
[fvc addObserver:self forKeyPath:@"logString" options:NSKeyValueObservingOptionNew context:NULL];
return self;
}
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog (@".... OBSERVE VALUE FOR KEY PATH...");
}
我期待什么输出?
每次按下FirstViewController中的按钮时,都应打印字符串“....键入路径的值<...”。
我得到了什么?
没有输出。
我做错了什么?请帮助我
答案 0 :(得分:3)
将您的“成员变量”放入单独的类文件中......即MODEL / view / controller。创建一个包含数据的单例模型对象,然后可以从任何视图控制器中对该模型对象进行KVO。
这是粗糙的伪代码:
@interface MyDataModel: NSObject
{
NSString *logString;
}
@property (nonatomic,retain) NSString *logString;
@end
@implementation MyDataModel
@synthesize logString;
+ (MyDataModel *) modelObject
{
static MyDataModel *instance = nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
if (instance == nil)
{
instance = [[self alloc] init];
}
});
return (instance);
}
@end
你VC1中的
MyDataModel *model = [MyDataModel modelObject];
[model setLogString:@"test"];
你的VC2中的
[model addObserver:self forKeyPath:@"logString" options:0 context:NULL];
更复杂的方法是将Core Data用作持久存储并充当您的数据模型。