UITABViewController中两个UIViewControllers之间的KVO机制

时间:2012-08-09 12:48:42

标签: objective-c ios

我是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中的按钮时,都应打印字符串“....键入路径的值<...”。

我得到了什么?

没有输出。

我做错了什么?请帮助我

1 个答案:

答案 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用作持久存储并充当您的数据模型。