2013-04-09 99 views
0

我有一個UIView子類CustomView,它具有屬性CustomObject *model以及一對IBOutlet屬性。 CustomObject有兩個屬性,NSString *titleNSString *imageName。我想要一個簡單的,可擴展的方式來更新CustomView的各種網點,只要model有任何變化。我覺得應該有一些簡單的方法來使用KVO來做到這一點,但由於一個新的對象可以分配到model,我不能只訂閱這些通知。當其屬性(模型)更改時更新UIView子類

我可以想到一種方法來做到這一點(我以前使用過)是重寫- (void)setModel:(CustomObject *)model重做我的佈局,並重新訂閱該對象的KVO鍵。這是最合理的解決方案,還是我忽略了明顯的東西?

+0

就這樣我很清楚,您的VIEW具有自定義對象屬性?我認爲這會使編碼比需要的更困難。通常你希望ViewController能夠訪問模型,並且IT更新視圖 – Pinwheeler 2013-04-10 01:15:23

+0

這是正確的。我是這樣構建的,以便視圖對它所描繪的模型有一個清晰的概念。也許最好讓視圖控制器在視圖上分配這些屬性。 – Ned 2013-04-10 01:38:23

+0

MVC上有許多變種。觀察觀察模型中的變化並自行更新是許多常見風格之一。 – 2013-04-10 03:10:17

回答

0

讓View對屬性的控制違背了MVC設計,儘管可能會讓事情變得更加困難。我建議你創建一個ViewController自定義子類,並讓它通過許多不同的方法將信息傳遞給視圖,其中一個是委託/協議分配,另一個是通知。

0

在我讀完你的問題之前,我會提出KVO的建議,所以,在問題結束之前,我不得不說,是的,這正是KVO的目的。但我也同意另一個答案(來自Pinwheeler) - 這不是觀察,而是觀察控制器。

但是,如果可能的話,視圖控制器更常用於管理模型和視圖。由於它負責兩者,它不需要觀察任何東西;它知道模型是否改變了,因爲它改變了模型。

0

我處理這個問題通過重寫setModel:這樣的:

- (void)setModel:(Model *)model { 
    if (model != _model) { 
     [self disconnectFromModel]; 
     _model = model; 
     [self connectToModel]; 
    } 
} 

dealloc我也呼籲disconnect

- (void)dealloc { 
    [self disconnectFromModel]; 
} 

connect,我建立連接的模型,如果我有一個,如果合適,我將模型(或模型的某個部分)傳遞給我的子視圖。例如:

- (void)connectToModel { 
    if (_model) { 
     // Maybe start KVO... 
     [_model addObserver:self forKeyPath:@"name" 
      options:NSKeyValueObservingOptionInitial context:&MyKVOContext]; 

     // Or maybe register for notifications... 
     nameNotificationObserver = [[NSNotificationCenter defaultCenter] 
      addObserverForName:ModelNameDidChangeNotification object:_model queue:nil 
      usingBlock:^(NSNotification *note) { 
       [self modelNameDidChange]; 
      }]; 

     // Maybe pass part of the model down to a subview... 
     [self.addressView setModel:model.address]; 
    } 
} 

disconnect,我簡單的取消我在connect做:

- (void)disconnectFromModel { 
    if (_model) { 
     [_model removeObserver:self forKeyPath:@"name" context:&MyKVOContext]; 

     [[NSNotificationCenter defaultCenter] removeObserver:nameNotificationObserver]; 
     nameNotificationObserver = nil; 

     [self.addressView setModel:nil]; 
    } 
} 

請注意,如果您有子視圖也觀察模型,模型的變化在兩道發生。首先,整個視圖層次與舊模型斷開。然後整個視圖層次連接到新模型。

相關問題