1

在 Apple 的“Token Field Programming Guide for Cocoa”中的“与代表的基本交互”部分中,当用户在令牌字段中键入一些文本时,代表会收到tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:消息。

当用户键入标记化字符时,委托会收到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;
}

当我在令牌字段中键入“maksim”然后删除它时,会出现一个日志:

2011-03-01 19:03:01.286 Aurum[23269:a0f] 代表ObjectForEditingString:m
2011-03-01 19:03:01.287 Aurum[23269:a0f] 代表ObjectForEditingString:m
2011-03-01 19:03:01.493 Aurum[ 23269:a0f] completionsForSubstring: m
2011-03-01 19:03:01.633 Aurum[23269:a0f]代表ObjectForEditingString: ma
2011-03-01 19:03:01.633 Aurum[23269:a0f] 代表ObjectForEditingString: ma
2011-03-01 19:03:01.637 Aurum[23269:a0f] completionsForSubstring: ma
2011-03-01 19:03:03.737 Aurum[23269:a0f] 代表ObjectForEditingString: mak
2011-03-01 19:03:03.737 Aurum[23269:a0f] 代表ObjectForEditingString : mak
2011-03-01 19:03:03.741 Aurum[23269:a0f] completionsForSubstring: mak
2011-03-01 19:03:05.089 Aurum[23269:a0f] 代表ObjectForEditingString:制作
2011-03-01 19:03:05.089 Aurum[23269:a0f] 代表ObjectForEditingString:制作
2011-03-01 19:03:05.094 Aurum[ 23269:a0f] completionsForSubstring: maks
2011-03-01 19:03:05.841 Aurum [23269:a0f]代表ObjectForEditingString: maksi
2011-03-01 19:03:05.841 Aurum [23269:a0f]代表ObjectForEditingString: maksi
2011-03-01 19:03:05.845 Aurum[23269:a0f] completionsForSubstring: maksi
2011-03-01 19:03:06.697 Aurum[23269:a0f]代表ObjectForEditingString: maksim
2011-03-01 19:03:06.697 Aurum[23269:a0f]代表ObjectForEditingString : maksim
2011-03-01 19:03:06.701 Aurum [23269:a0f] 完成子字符串: maksim
2011-03-01 19:03:12.353 Aurum[23269:a0f] 代表ObjectForEditingString: maksi
2011-03-01 19:03:12.354 Aurum[23269:a0f] 代表ObjectForEditingString: maksi
2011-03-01 19:03:12.853 Aurum[ 23269:a0f]代表ObjectForEditingString:制作
2011-03-01 19:03:12.854 Aurum [23269:a0f]代表ObjectForEditingString:制作
2011-03-01 19:03:12.936 Aurum [23269:a0f]代表ObjectForEditingString:制作
2011-03-01 19:03:12.937 Aurum[23269:a0f]代表ObjectForEditingString:mak
2011-03-01 19:03:13.020 Aurum[23269:a0f]代表ObjectForEditingString:ma
2011-03-01 19:03:13.020 Aurum[23269:a0f]代表ObjectForEditingString : ma
2011-03-01 19:03:13.103 Aurum[23269:a0f] 代表ObjectForEditingString: m
2011-03-01 19:03:13.104 Aurum [23269:a0f] 代表ObjectForEditingString:m

那么谁能解释我出了什么问题以及为什么令牌字段表现得如此奇怪?

4

1 回答 1

1

我只是试图通过复制和粘贴您的代码来重现这一点。我有:

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(毕竟,您可以逐个字符地删除它)。

于 2011-03-09T19:54:34.573 回答