2011-03-02 56 views
1

在Apple的「可可的令牌字段編程指南」中的「基本與委託的交互」一節中指出,當用戶在令牌字段中鍵入一些文本時,委託收到消息tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:NSTokenField代理

而當用戶鍵入標記字符時,代表接收到tokenField:representedObjectForEditingString:消息。

所以當我實現這個方法時,它的行爲方式非常不同。

還有就是我實現的委託方法:

- (NSArray *)tokenField:(NSTokenField *)tokenFieldArg 
completionsForSubstring:(NSString *)substring 
      indexOfToken:(NSInteger)tokenIndex 
    indexOfSelectedItem:(NSInteger *)selectedIndex { 

NSLog(@"completionsForSubstring: %@", substring); 
return [NSArray array]; 
}  

- (id)tokenField:(NSTokenField *)tokenField 
representedObjectForEditingString:(NSString *)editingString { 

NSLog(@"representedObjectForEditingString: %@", editingString); 
return editingString; 
} 

而且還有一個日誌,當我在令牌字段中鍵入「馬克西姆」,然後刪除它:

2011-03-01 19 :03:01.286 Aurum [23269:a0f] representObjectForEditingString:m Aurod [23269:a0f] representObjectForEditingString:m
2011-03-01 19:03:01.493 Aurum [23269: a0f] completionsForSubstring:m
2011-03-01 19:03:01.633奧羅[23269:A0F] representedObjectForEditingString:毫安
2011-03-01 19:03:01.633奧羅[23269:A0F] representedObjectForEditingString:毫安
2011-03-01 19 :03:01.637 Aurum [23269:a0f] completionsForSubstring:ma
2011-03-01 19:03:03.737 Aurum [23269:a0f] representObjectForEditingString:mak
2011-03-01 19:03:03.737 Aurum [23269: A0F] representedObjectForEditingString:MAK
2011-03-01 19:03:03.741奧羅[23269:A0F] completionsForSubstring:MAK
2011-03-01 19:03:05.089奧羅[23269:A0F] representedObjectForEditingString:MAKS
2011-03-01 19:03:05.089 Aurum [23269:a0f] representObjectForEditingString:maks
2011-03-01 19:03:05.094 Aurum [23269:a0f] completionsForSubstring:maks
2011-03-01 19: 03:05.841 Aurum [23269:a0f] representObjectForEditingString:maksi
2011-03-01 19:03:05.841 Aurum [23269:a0f] representObjectForEditingString:maksi
2011-03-01 19:03:05.845 Aurum [23269:a0f ] completionsForSubstring:maksi
2011-03-01 19:03:06.697奧羅[23269:A0F] representedObjectForEditingString:馬克西姆
2011-03-01 19:03:06.697奧羅[23269:A0F] representedObjectForEditingString:馬克西姆
2011- 03-01 19:03:06.701 Aurum [23269:a0f] completionsForSubstring:maksim
2011-03-01 19:03:12.353 Aurum [23269:a0f] representObjectForEditingString:maksi
2011-03-01 19:03:12.354 Aurum [23269 :A0F] representedObjectForEditingString:maksi
2011-03-01 19:03:12.853奧羅[23269:A0F] representedObjectForEditingString:MAKS
2011-03-01 19:03:12.854奧羅[23269:A0F] representedObjectForEditingString:MAKS
2011-03-01 19:03:12.936 Aurum [23269:a0f] representObjectForEditingString:mak
2011-03-01 19:03:12.937 Aurum [23269:a0f] representObjectForEditingString:mak
2011-03-01 19:03 :13.020 Aurum [23269:a0f] representObjectForEditingString:ma
2011-03-01 19:03:13。020 Aurum [23269:a0f] representObjectForEditingString:ma
2011-03-01 19:03:13.103 Aurum [23269:a0f] representObjectForEditingString:m
2011-03-01 19:03:13.104 Aurum [23269:a0f] representObjectForEditingString :m

所以任何人都可以解釋我出了什麼問題,爲什麼令牌字段表現得如此陌生?

+0

我在您發佈的日誌中沒有看到任何奇怪的東西。你期望'NSTokenField'做什麼? – Yuji 2011-03-02 12:49:40

+0

我希望當我輸入任何符號時,NSTokenField會發送completionsForSubstring:消息來刪除它。只有在我輸入一個tokynized字符後,它纔會發送representObjectForEditingString:消息,只有一次但不是兩次。 – Maksim 2011-03-02 13:05:47

回答

0

我只是試圖通過複製和粘貼你的代碼來重現這一點。我得到了:

2011-03-09 14:52:48.888 StackOverflowTesting[27789:a0f] completionsForSubstring: m 
2011-03-09 14:52:49.242 StackOverflowTesting[27789:a0f] completionsForSubstring: ma 
2011-03-09 14:52:49.560 StackOverflowTesting[27789:a0f] completionsForSubstring: mak 
2011-03-09 14:52:49.911 StackOverflowTesting[27789:a0f] completionsForSubstring: maks 
2011-03-09 14:52:50.017 StackOverflowTesting[27789:a0f] completionsForSubstring: maksi 
2011-03-09 14:52:50.217 StackOverflowTesting[27789:a0f] completionsForSubstring: maksim 
2011-03-09 14:52:50.647 StackOverflowTesting[27789:a0f] representedObjectForEditingString: maksim 

這正是我期望的輸出結果。你是否更改過NSTokenField的默認標記字符?當你點擊標記化字符時,它看起來不像是將標記化的maksim(因爲畢竟你可以逐個字符地刪除它)。

+0

謝謝斯蒂芬。我只是嘗試在接口中放置另一個新的令牌字段並將其連接到委託,然後獲得與您相同的日誌。所以我發現什麼是問題。舊的令牌字段綁定到數組控制器(值綁定)。 – Maksim 2011-03-16 15:29:54