3

私はiPhoneを初めて使用します。KVOメカニズムを実装しようとしています。

私は何を持っていますか?

2つのUIViewControllerを備えた2つの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のボタンを押すたびに、文字列「.... OBSERVE VALUE FORKEYPATH...」が出力されます。

私は何を得るのですか?

出力なし。

私は何を間違っているのですか?親切に助けてください

4

1 に答える 1

3

「メンバー変数」を別のクラスファイルに入れます...つまり、MODEL / view/controllerです。データを保持するシングルトンモデルオブジェクトを作成すると、任意のViewControllerからそのモデルオブジェクトを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 に答える