2013-04-09 73 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]; 
    } 
} 

请注意,如果您有子视图也观察模型,模型的变化在两道发生。首先,整个视图层次与旧模型断开。然后整个视图层次连接到新模型。

相关问题