2010-06-30 42 views
2

我有幾個NSComboBoxes在Interface Builder中創建,並且以編程方式創建。如何通過KVC設置NSComboBox的值?

在Interface Builder中創建的NSComboBox是完美的。我將它們的值綁定到共享用戶默認控制器,並且當他們的視圖打開時,他們以正確的值坐在那裏。重要的是,這個值在NSComboBox中顯示爲「正常」文本。換句話說,該值不會被選中。這就是我要的。

對於以編程方式創建的NSComboBox,我使用selectItemAtIndex設置值:0。當我這樣做時,選擇了正確的項目 - 但文字出現選中。也就是說,它是突出顯示的和一切。我不想要這個。以下是我嘗試的解決方法:

(i)獲取字段編輯器並將插入點設置爲文本末尾。雖然奇怪的是,在這樣做時,字段編輯器的字符串不是零就是空。我不確定這是否是現場編輯的正確行爲。

(II)嘗試設置在組合框的值的各種其他方式,如setObjectValue,takeStringValueFrom等

(ⅲ)最後,也是最令人沮喪的,我試圖使用設置NSComboBox的值[ myComboBox setValue:@「Default Item」forKey:@「value」];這與objc_exception_throw失敗,大概是因爲沒有這樣的KVC密鑰。但是我知道組合框的價值可以由KVO設置,因爲它可以在界面構建器中使用!我猜測我不知道正確的關鍵路徑。我嘗試枚舉使用自省的所有屬性,但我無法使代碼正常工作(objc_property_t不在預期的標題中)。

所以,我有兩個問題:

首先,沒有人知道如何爲NSComboBox設置默認值編程,這樣在框中的文本未選中?如果涉及到這一點,我將盡全力做到這一點,包括一個新的NSComboBoxCell子類。

其次,有人可以告訴我什麼關鍵或關鍵路徑IB用於設置NSComboBox的值?或者,爲什麼我的努力失敗了?

我一直在這個工作了很多小時,現在我真的很disspirited!


謝謝,mustISignUp!很高興有這個修復。一點後續:

(i)選擇的文本肯定是由焦點造成的。調用setRefusesFirstResponder:YES修復了這個問題。不幸的是,該窗口真的想把重點放在這個組合框上,因爲設置拒絕FirstResponder返回到NO(稍後,在窗口初始化之後)再次導致文本選擇(如果他願意,我希望用戶能夠集中在這個框上)。因此,就我而言,最終的解決方案是調用[window makeFirstResponder:otherControl]。奇怪的是,雖然[window makeFirstResponder:nil]不起作用。任何想法爲什麼? (ii)感謝您指出了綁定和屬性之間的區別。在研究這個問題時我學到了很多東西。首先,我知道你可以通過調用 - (NSArray *)exposedBindings來獲取綁定列表,它爲NSComboBox返回(fontSize,alignment,toolTip,fontName,enabled,contentValues,fontFamilyName,font,hidden,fontItalic,textColor,value ,內容,可編輯,fontBold)。其次,我可以使用[myComboBox bind:@「value」toObject:[NSMutableString stringWithString:@「defaultValue」] withKeyPath:@「string」options:nil]來設置值,其中NSMutableString有一個類別,它將「字符串「轉換成屬性。最後,這實際上並沒有解決文本選擇「問題」。這個組合框中的文本選擇和Interface Builder中的文本選擇之間的區別必須是它們在窗口中的位置......我猜這個組合框只是被設置爲initialFirstResponder而其他組件不是。

所以我唯一剩下的問題可能就是爲什麼[window makeFirstResponder:nil]無法使焦點離開組合框。不是非常重要,但如果有人有想法,我會好奇的。

回答

2

首先,我認爲文本被選中是因爲調用selectItemAtIndex:已將comboBox設置爲firstResponder。您可以使用setRefusesFirstResponder:YES或者您可以讓另一個項目成爲第一個響應者,以使文本不會顯示爲選中狀態。

如果我理解正確,並且想要更改組合框的選擇,請按照正確的方式進行操作。其次,你很迷惑Bindings和KVC。 NSComboBox有一個名爲「值」的綁定,而不是稱爲「值」的屬性。嘗試使用setValue:forKey:來設置它是沒有意義的,Interface Builder肯定不會這樣做。

你會覺得這是不明顯的,令人困惑,也許更好的名字可能已被選定爲綁定。

+0

感謝!請參閱上面的我的後續響應,作爲對問題的編輯。 – Dennis

+0

我沒有真正的答案,但如果你沒有使用FScript來幫助你這樣的事情,你一定會想。將FScript框架放在Library/Frameworks中,並與其鏈接。添加[[NSApp mainMenu] addItem:[[FScriptMenuItem alloc] init]];到-applicationDidFinishLaunching。啓動您的應用程序並查看FScript menuItem。從菜單啓動一個「瀏覽器查看」,你現在可以選擇你的窗口,視圖或組合框,並嘗試發送消息。這對於像這樣的東西是非常寶貴的。 – hooleyhoop

+0

看起來很棒。感謝這個指針。 – Dennis