0

我有一个 UIView 子类CustomView,它有一个属性CustomObject *model,以及几个IBOutlet属性。CustomObject有两个属性,一个NSString *titleNSString *imageName。我想要一种简单、可扩展的方式来更新CustomView's 的各种网点,只要有任何model变化。我觉得应该有一些使用 KVO 的简单方法来做到这一点,但是由于可以将新对象分配给model,所以我不能只订阅这些通知。

我可以想到一种方法(我以前使用过)是重写- (void)setModel:(CustomObject *)model以重做我的布局并重新订阅该对象的 KVO 键。这是最合理的解决方案,还是我忽略了一些明显的东西?

4

3 回答 3

0

让视图控制属性违背了 MVC 设计,这虽然可能使事情变得更加困难。我建议您创建一个 ViewController 自定义子类,并让它通过许多不同的方法将信息传递给视图,其中一种是委托/协议分配,另一种是通知。

于 2013-04-10T02:14:59.927 回答
0

在我读完你的问题之前,我打算建议 KVO,所以,在你的问题结束后,我不得不说,是的,这正是 KVO 的用途。但我也同意另一个答案(来自 Pinwheeler)——不是应该进行观察的视图,而是视图控制器。

但是,如果可能,视图控制器更常见的是同时管理模型和视图。既然两者都管,就不需要观察什么;它知道模型是否因为它改变了模型而改变。

于 2013-04-10T02:27:02.307 回答
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];
    }
}

请注意,如果您确实有也观察模型的子视图,则模型的更改发生在两次传递中。首先,整个视图层次结构与旧模型断开连接。然后整个视图层次结构连接到新模型。

于 2013-04-10T03:35:06.513 回答