2011-04-11 88 views
9

是否可以將觀察者添加到簡單變量(如BOOL或NSIntegers)並查看它們何時更改?將觀察者添加到BOOL變量

謝謝!

+0

沒有這些答案的一個幫助你(我或其他)? – XJones 2011-04-14 18:09:11

回答

22

您可以觀察到鍵值在其值發生變化時得到通知。數據類型可以是任何東西。對於定義爲Objective-C屬性的任何內容(在.h文件中使用@property),這已準備就緒,因此如果要觀察添加到視圖控制器的BOOL屬性,請按以下步驟操作:

in myViewController.h:

在myViewController.m

@implementation myViewController 

@synthesize mySetting; 

// rest of myViewController implementation 

@end 
在otherViewController.m

@interface myViewController : UIViewController { 
    BOOL  mySetting; 
} 

@property (nonatomic) BOOL mySetting; 

// assumes myVC is a defined property of otherViewController 

- (void)presentMyViewController { 
    self.myVC = [[[MyViewController alloc] init] autorelease]; 
    // note: remove self as an observer before myVC is released/dealloced 
    [self.myVC addObserver:self forKeyPath:@"mySetting" options:0 context:nil]; 
    // present myVC modally or with navigation controller here 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if (object == self.myVC && [keyPath isEqualToString:@"mySetting"]) { 
     NSLog(@"OtherVC: The value of self.myVC.mySetting has changed"); 
    } 
} 
+0

in myViewController [self setMySetting:YES];更新 – mconnors 2013-11-26 14:48:31

-1

如果它們是對象的屬性,那麼是的。

如果他們不是屬性,那麼沒有。

+0

沒什麼,我只是不知道如何使用它來查找變量值的變化。 – Andrei 2011-04-11 16:01:05

+0

糾正我,如果我錯了,但afaik它不必是一個屬性,它可以是2個方法一個getter - [boolName]和一個setter - 設置[boolName],將採取並返回一個NSNumber – 2011-04-11 16:03:22

+0

我' m實際上是指從UIViewControllers編輯BOOL變量。所以從某種意義上說,它們是屬性,但沒有我製造的對象。 – Andrei 2011-04-11 16:06:11

1

是;唯一的要求是這些變量出現的對象是這些屬性的鍵值兼容。

5

我相信你的意思是:如果屬性發生了變化,如何從'change'字典中獲得INT或BOOL值。

您可以簡單地這樣來做:

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"mySetting"]) 
    { 
     NSNumber *mySettingNum = [change objectForKey:NSKeyValueChangeNewKey]; 
     BOOL newSetting = [mySettingNum boolValue]; 
     NSLog(@"mySetting is %s", (newSetting ? "true" : "false")); 
     return; 
    } 

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
} 
+0

是否有一個特定的原因,如果你處理你的變量,而不是調用超級方法,你會返回?這樣超級方法只在調用KVO時調用,並不是你的變量。 – Leon 2017-02-23 10:02:04