2010-03-17 68 views
0

我認爲我有NSTextField。它的值綁定到我的控制器中的NSNumber *number。控制器只需調用模型(value)即可獲得適當的值。如何通過控制器連接模型到使用綁定進行查看?

// In the controller 
- (NSNumber *)number { 
    return [NSNumber numberWithFloat:[model value]]; 
} 
- (void)setNumber:(NSNumber *)aNumber { 
    [model setValue:[aNumber floatValue]]; 
} 

這是細,只有控制器沒有被通知的模型的變化,從而,改變模型中的不更新NSTextField的值。

我能想到的唯一的其他選擇是讓模型通知控制器和控制器手動通過出口更新視圖。但是這規避了約束。

// In the model, after value change 
[[NSNotificationCenter defaultCenter] postNotificationName:@"ValueChanged" object:self]; 

// In the controller, after being notified 
- (void)updateView:(NSNotification *)aNotification { 
    [myTextField setFloatValue:[model value]]; 
} 

是否有更好的綁定感知的方式來實現此通信?

回答

1

我在我看來有一個NSTextField。它的值綁定到我的控制器中的一個NSNumber *號碼。控制器只需調用模型(值)即可獲得適當的值。

爲什麼這個屬性將值包裝在NSNumber中? KVC會將原始值(例如float s)轉換爲來自對象的原始值。

這很好,只有控制器沒有通知模型更改,因此,更改模型中的值不會更新NSTextField。

的模式轉變是不是與此有關,而控制器並不需要了解模型的特性改變的值,除非控制器是觀察到財產,在這種情況下,控制器得到這些更改的通知,因爲您正在使用模型的屬性訪問器。

問題是,您沒有通過模型綁定文本字段 - 而是將其綁定到控制器上的僞屬性。

因此,假設控制器已經暴露了模型對象的屬性,只需將文本字段綁定到控制器,其關鍵路徑爲model.value

2

在您的控制器中,覆蓋類方法keyPathsForValuesAffectingValueForKey:。喜歡的東西:

+(NSSet*) keyPathsForValuesAffectingValueForKey:(NSString*)key 
{ 
    if([key isEqual:@"number"]) 
     return [NSSet setWithObject:@"model.value"]; 
    return [NSSet set]; 
} 

(我不是在我的Mac所以這是未經測試,但總體思路應該是聲音)

2

另一種選擇(而我通常做我自己,純粹是爲了個人喜好) (在控制器中):

-(void)setModel:(id)m 
{ 
    [model removeObserver:self forKeyPath:@"value"]; 

    [m retain]; 
    [model release]; 
    model = m; 

    [model addObserver:(self) forKeyPath:@"value" options:NSKeyValueObservingOptionNew context:NULL]; 
} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if([keyPath isEqual:@"value"]) 
    { 
     [self willChangeValueForKey:@"number"]; 
     [self didChangeValueForKey:@"number"]; 
    } 
} 

此外,此代碼未經測試,但總體思路應該起作用。

+0

綁定到模型中是個好主意嗎?我對此有一種奇怪的不好的感覺,我無法解釋。 – bastibe 2010-03-18 12:16:59

+0

好吧,它不是綁定。這是KVO。綁定建立在KVO之上,但KVO是獨立的。我不知道這是一個好主意還是一個壞主意。 KVO只是一個工具。 我喜歡讓我的控制器觀察我的視圖,因爲它感覺不太適合我。該模型甚至不必知道控制器存在。 我確定存在替代觀點。 – 2010-03-18 18:41:20