2010-06-08 34 views

回答

6

NSTokenField是NSTextField的子類。沒有簡單直接的方法來直接操作這些類的選擇(除了選擇全部的選擇)。

要做到這一點,當它成爲第一個響應者,你需要繼承NSTokenField(記得要設置類的字段在你的XIB到您的自定義子類),並覆蓋-becomeFirstResponder像這樣:

- (BOOL)becomeFirstResponder 
{ 
    if ([super becomeFirstResponder]) 
    { 
     // If super became first responder, we can get the 
     // field editor and manipulate its selection directly 
     NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self]; 
     [fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)]; 
     return YES; 
    } 
    return NO; 
} 

該代碼首先查看super是否回答「yes」(併成爲第一響應者)。如果是這樣,我們知道它會有一個字段編輯器(一個NSText實例),它的選擇我們可以直接操作。所以我們得到它的字段編輯器並設置它的選定範圍(我把插入點放在{lastchar,nolength}範圍的末尾)。

爲此當該字段被完成編輯(返程,跳格出等),覆蓋-textDidEndEditing:這樣的:

- (void)textDidEndEditing:(NSNotification *)aNotification 
{ 
    [super textDidEndEditing:aNotification]; 
    NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self]; 
    [fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)]; 
} 

在這種情況下,當用戶結束編輯,該方法允許超級做它的事情,然後它看起來是否仍然是第一響應者。如果是這樣,它和上面一樣:將插入克拉放在場地的盡頭。

請注意,此行爲不是標準的,並且是意外的。謹慎使用。

+0

謝謝約書亞,那有效!但是按ENTER鍵時的行爲呢。試圖重寫'keyDown:'不起作用。任何想法來禁用這種行爲? – Robert 2010-06-10 12:01:58

+0

我用-textDidEndEditing:case更新了答案。由於這兩種方法最終都會調用相同的東西,它開始看起來像重構的工作。我會將字段編輯器代碼放入其自己的方法(如-adjustSelection)中,並調用該代碼以使代碼更具可讀性並減少重複性。 – 2010-06-10 14:08:19

+0

textDidEndEditing:案件對我來說工作不正常。讓我們說在最後一個標記之後設置文本光標,並且不要開始輸入任何字符,而只需單擊RETURN。這種情況下,即使我添加了textDidEndEditing:提案,所有標籤都被選中。任何想法爲什麼? – Robert 2010-06-11 19:57:33