2010-01-22 58 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。請注意,我對你的視覺課程一無所知。