3

我是 iPhone 新手。我正在尝试实现 KVO 机制。

我有的?

两个 TabController 有两个 UIViewController,FirstViewController 有一个按钮,SecondViewController 有一个 UITextView

我想要的是?

当在 firstViewController 中按下按钮时,它会更新成员变量,该变量应由 secondViewController 观察,并应附加到 UITextView。

我做了什么?

第一视图控制器.h

@interface FirstViewController : UIViewController
{
    IBOutlet UIButton *submitButton;

}

-(IBAction)submitButtonPressed;

@property (retain) NSString* logString;
@end

第一视图控制器.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

第二视图控制器.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...”。

我得到什么?

无输出。

我做错了什么?请帮助我

4

1 回答 1

3

把你的“成员变量”放到一个单独的类文件中......即模型/视图/控制器。制作一个保存数据的单例模型对象,然后您可以从任何视图控制器中 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 作为持久存储并充当您的数据模型。

于 2012-08-09T13:12:07.897 回答