【问题标题】:NSNotification the right choice for detecting changes?NSNotification 检测变化的正确选择?
【发布时间】:2010-01-22 20:25:23
【问题描述】:

我有一个 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];
}

}

【问题讨论】:

    标签: objective-c cocoa nsnotification


    【解决方案1】:

    你的视图不应该做出这个决定,视图控制器应该。一般来说,您应该尽量避免视图需要有关模型或控制器实现信息的情况。

    您的视图应该有一个标志,例如名为drawLowStateBOOL 属性。当这个值改变时,应该通过执行以下操作以不同的外观重绘视图:

    YourView.m:

    - (void)setDrawLowState:(BOOL)isLow
    {
        if(drawLowState != isLow)
        {
            drawLowState = isLow;
            [self setNeedsDisplay];
        }
    }
    

    您可以根据drawLowState 属性的值更改在视图对象的绘图例程中绘制的内容,从而更改视图的外观。

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

    YourViewController.m:

    - (void)setGenCount:(NSInteger)aCount
    {
        genCount = aCount;
        self.view.drawLowState = (genCount < 3);
    }
    

    【讨论】:

    • 所以总结一下,为了更新genCount,我不需要实现NSNotification对象,因为我可以使用自定义的setter方法来完成显示的重绘。
    • 没错。您的实现的主要变化是视图controller,而不是view,它决定了视图应该显示什么。视图只是根据标志更改其状态。由于视图控制器始终使用self.view 引用视图,因此无需使用通知,您只需直接在视图上设置属性即可。当您需要一个或多个对象在没有直接连接(通过 ivars、插座或其他方式)的情况下对另一个对象的更改做出反应时,通常会使用通知。
    【解决方案2】:

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

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

    然后,当您更改 frobs 的值时,请始终使用 setFrobs。请注意,我对您的视图类一无所知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多