2010-01-22 30 views
1

我有一个自定义的UIView的子类,当值(NSInteger)低于某个值时需要执行一个选择器。从我可以从文档中得知的信息,我需要设置一个观察对象来寻找这个变化。NSNotification是检测变化的正确选择吗?

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

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

您的看法应该有一个标志,例如一个名为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); 
} 
+0

因此,总结一下,为了更新genCount,我不需要实现一个NSNotification对象,因为我可以使用自定义setter方法来完成重新绘制显示。 – 2010-01-23 23:27:58

+0

这是正确的。你实现的主要变化是view * controller *,而不是* view *,它决定了视图应该显示的内容。该视图仅基于标志更改其状态。由于视图控制器总是使用'self.view'对视图进行引用,因此不需要使用通知,只需直接在视图上设置属性即可。当没有直接连接时,通过ivars,网点或其他方式,当需要一个或多个对象对另一个对象中的更改作出反应时,通常会使用通知。 – 2010-01-24 03:15:28

0

我会把代码发布在视图类中的通知。例如:

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

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