Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSNotification是检测更改的正确选择吗?_Objective C_Cocoa_Nsnotification - Fatal编程技术网

Objective c NSNotification是检测更改的正确选择吗?

Objective c NSNotification是检测更改的正确选择吗?,objective-c,cocoa,nsnotification,Objective C,Cocoa,Nsnotification,我有一个自定义的UIView子类,当某个值(NSInteger)低于某个值时,它需要执行选择器。从文档中可以看出,我需要设置一个观察者对象来查找此更改 NSInteger值存在于视图控制器中,UIView子类作为同一视图控制器中的子视图实现 我想知道下面这样的事情是否在正确的轨道上: -(void)createNotification: [[NSNotificationCenter defaultCenter] addObserver:self //

我有一个自定义的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
}
if(genCount<3){
///代码语句
}
我希望我的观察者查找上述更改,然后执行后续操作。我会像这样将其添加到通知对象中吗

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

}
-(void)genCountLow:(NSNotification*)通知{
如果(genCount<3){
[电气系统图查看车辆供电用电];
}
}

我将把发布通知的代码放在view类中。例如:

- (void)setFrobs:(NSInteger)frobs {
    if (frobs < 3 && _frobs >= 3)
        [[NSNotificationCenter default...] postNotificationName:...];
    _frobs = frobs;
}
-(void)setFrobs:(NSInteger)frobs{
如果(frobs<3&&U frobs>=3)
[[NSNotificationCenter默认…]postNotificationName:…];
_青蛙=青蛙;
}

然后,在更改FROB的值时始终使用SETFROB。请注意,我对视图类一无所知。

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

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

在YourView.m:

- (void)setDrawLowState:(BOOL)isLow
{
    if(drawLowState != isLow)
    {
        drawLowState = isLow;
        [self setNeedsDisplay];
    }
}
- (void)setGenCount:(NSInteger)aCount
{
    genCount = aCount;
    self.view.drawLowState = (genCount < 3);
}
您可以通过基于
drawLowState
属性的值更改视图对象的绘制例程中绘制的内容来更改视图的外观

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

在YourViewController.m:

- (void)setDrawLowState:(BOOL)isLow
{
    if(drawLowState != isLow)
    {
        drawLowState = isLow;
        [self setNeedsDisplay];
    }
}
- (void)setGenCount:(NSInteger)aCount
{
    genCount = aCount;
    self.view.drawLowState = (genCount < 3);
}
-(void)setGenCount:(NSInteger)aCount
{
genCount=一个账户;
self.view.drawLowState=(genCount<3);
}

总之,为了更新genCount,我不需要实现NSNotification对象,因为我可以使用自定义setter方法来完成显示的重绘。这是正确的。实现的主要变化是由视图控制器而不是视图决定视图应该显示什么。视图只是根据标志更改其状态。由于视图控制器始终使用
self.view
引用视图,因此无需使用通知,只需直接在视图上设置属性即可。当您需要一个或多个对象对另一个对象中的更改作出反应时,如果没有直接连接,则通常通过IVAR、插座或其他方式使用通知。