NSNotification是检测变化的正确选择吗?

时间:2010-01-22 03:37:49

标签: objective-c cocoa nsnotification

我有一个UIView的自定义子类,当值(NSInteger)低于某个值时需要执行选择器。从我从文档中可以看出,我需要设置一个观察者对象来寻找这种变化。

NSInteger值存在于视图控制器中,UIView子类在同一视图控制器中实现为子视图。

我想知道以下内容是否在正确的轨道上:

-(void)createNotification:
[[NSNotificationCenter defaultCenter]
                       addObserver:self //since this is in the viewController, I'm thinking it's "self"
                       selector:@selector(genCountLow:)
                       name:@"ReviewGenCount"
                       object: nil ];      

我正在努力为这个观察者添加条件以执行操作。例如,如果条件是:

if(genCount < 3) {
///code statement
}

我希望我的观察者寻找上述变化,然后执行后续操作。我会将它添加到我的通知对象吗?

- (void)genCountLow:(NSNotification *)notification {
    if (genCount < 3) {
[electricalSystemDiagramView depowerShedBuses];
}

}

2 个答案:

答案 0 :(得分:2)

您的视图不应该做出此决定,视图控制器应该。通常,您应该尝试避免视图需要有关于模型或控制器实现的信息的情况。

您的视图应该有一个标志,例如名为BOOL的{​​{1}}属性。当此值更改时,应通过执行以下操作重新绘制具有不同外观的视图:

YourView.m中:

drawLowState

您可以通过根据- (void)setDrawLowState:(BOOL)isLow { if(drawLowState != isLow) { drawLowState = isLow; [self setNeedsDisplay]; } } 属性的值更改在视图对象的绘图例程中绘制的内容来更改视图的外观。

由于视图控制器知道整数值何时发生变化,因此您可以轻松地在setter中为整数属性做出决定并告诉视图更新其外观:

YourViewController.m中:

drawLowState

答案 1 :(得分:0)

我会将用于发布通知的代码放在视图类中。例如:

- (void)setFrobs:(NSInteger)frobs {
    if (frobs < 3 && _frobs >= 3)
        [[NSNotificationCenter default...] postNotificationName:...];
    _frobs = frobs;
}

然后,在更改frobs的值时始终使用setFrobs。请注意,我对你的观点课程一无所知。