2009-01-06 61 views
2

在IB中,很容易將標籤或文本字段綁定到某個控制器的keyPath。如何爲NSApp.dockTile創建綁定

NSDockTile(可通過[[NSApp dockTile] setBadgeLabel:@「123」])不會出現在IB中,我無法弄清楚如何以編程方式綁定其「badgeLabel」屬性,就像您可能綁定標籤/ textfield/table列。

任何想法?

回答

3

NSDockTile沒有任何綁定,因此您的控制器將不得不手動更新底座切片。你可以使用KVO來做到這一點,它與綁定它有相同的效果。

創建上下文作爲全球:


static void* MyContext=(void*)@"MyContext"; 

然後,在你的init方法:


[objectYouWantToWatch addObserver:self forKeyPath:@"dockTileNumber" options:0 context:MyContext]; 

你就必須實現這個方法來通知更改關鍵路徑:

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if (context == MyContext) { 
     [[NSApp dockTile] setBadgeLabel:[object valueForKeyPath:keyPath]]; 
    } 
    else { 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 

確保在控制器對象消失時刪除觀察者。

2

如果NSDockTile不支持綁定,則可以使用方法bind:toObject:withKeyPath:options:在badgeLabel屬性上設置綁定。檢查文檔以獲取有關使用哪些參數的詳細信息。如果它不起作用,您可以在控制器類中實現關鍵值觀察,並在每次更改值時更新標籤,甚至可以覆蓋NSDockTile以創建綁定兼容的子類。

0

我在數據源上的控制器上試過NSDockTile上bind:toObject:withKeyPath:options:的很多變體。我找不出可行的組合。或者,是否有一種可以綁定到數據源的BatchController對象,然後更新徽章?我如何獲取NSObject並使其可綁定?

+0

你沒有。如果一個對象沒有明確支持綁定到一個屬性,那麼它可能會做一些事情,使綁定行爲不正常(例如,直接分配給它的ivar)。無論如何綁定它將在你的應用中表現出這種行爲。 – 2009-01-07 03:52:24