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 中的选项卡吗?

UITabViewController 为空

是否可以从嵌入式 UITableViewController 设置父 UITabViewController 属性

自定义 XIB 视图触摸 UINavigationController

苹果手机:TabView + TableView