UITABViewController 中两个 UIViewController 之间的 KVO 机制
Posted
技术标签:
【中文标题】UITABViewController 中两个 UIViewController 之间的 KVO 机制【英文标题】:KVO mechanism between two UIViewControllers in the UITABViewController 【发布时间】:2012-08-09 12:48:42 【问题描述】:我是 iPhone 新手。我正在尝试实现 KVO 机制。
我有什么?
两个 TabController 有两个 UIViewController,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 中的按钮时,都应打印字符串“.... OBSERVE VALUE FOR KEY PATH...”。
我得到了什么?
没有输出。
我做错了什么?请帮助我
【问题讨论】:
【参考方案1】:将您的“成员变量”放入单独的类文件中......即模型/视图/控制器。制作一个包含数据的单例模型对象,然后您可以从任何视图控制器中对该模型对象进行 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 作为持久存储并充当您的数据模型。
【讨论】:
感谢您的回复。我对ios非常陌生。您介意提供更多信息以便我可以深入研究吗? 已编辑答案以显示一些粗略的代码,让您朝着正确的方向前进 对于静态的instance
,它的指针总是一样的吗?既然是单例?
[alloc init] 被调用一次,之后实例的值不会改变。考虑将初始化代码放入 dispatch_once 块中,我将编辑答案以显示如何执行此操作以上是关于UITABViewController 中两个 UIViewController 之间的 KVO 机制的主要内容,如果未能解决你的问题,请参考以下文章
UITabViewController:选中的选项卡,更新 UIViewController
UISplitViewController 可以成为 UITabViewController 中的选项卡吗?
是否可以从嵌入式 UITableViewController 设置父 UITabViewController 属性