在Mail的 NSTokenField 中输入无效的电子邮件时,一个得到这个(混合令牌和纯字符串值):
有没有可行的方法来实现这个目标?
NSTokenField甚至是正确的工具吗?或者我会滥用它?
在这个特定项目中,我需要允许用户输入文件名模式
(还有其他一些用例),支持预定义的令牌。
现在我要求输入如下:
Glue Text %[Tag]Other Glue Text%[Another Tag]More Text
我想将其更改为这样的一些防呆图形解决方案:
NSTokenField always(!)将输入的文本转换为标记。
我在网络搜索中使用了错误的关键字,
或者我真的是第一个需要这种(混合)行为的人?!
我确实通过Apple的NSTokenField指南阅读,但找不到有关我的问题的任何信息。
答案 0 :(得分:12)
您需要实现委托方法tokenField:styleForRepresentedObject:
,以便为令牌返回NSRoundedTokenStyle
,或为其他文本返回NSPlainTextTokenStyle
。除非您的委托返回其他对象,否则令牌的表示对象是令牌字符串本身。
这应该可以解决你的问题:
- (NSTokenStyle)tokenField:(NSTokenField *)tokenField
styleForRepresentedObject:(id)representedObject
{
if ([representedObject rangeOfString: @"%["].location == 0) {
return NSRoundedTokenStyle;
} else {
return NSPlainTextTokenStyle;
}
}
答案 1 :(得分:2)
实际上,您首先必须定义一个标记字符,在您的情况下将是%
[tokenField setTokenizingCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@"%%"]];
输入字符串也需要更改为:
胶水文字%[Tag]%其他胶水 文字%[另一个标签]%更多文字
...以便Cocoa知道令牌的结束位置。
如果您希望[Tag]在令牌字段中显示为Tag,您还需要实现tokenField:displayStringForRepresentedObject:
方法:
- (NSTokenStyle)tokenField:(NSTokenField *)tokenField
displayStringForRepresentedObject:(id)representedObject
{
if ([representedObject rangeOfString: @"["].location == 0) {
return [(NSString*)representedObject substringWithRange:NSMakeRange(1, [(NSString*)representedObject length]-2)];
return representedObject;
}
但是,这有一个很大的缺点:如果您复制或只是移动一个令牌,Cocoa将调用tokenField:displayStringForRepresentedObject:
,复制/移动的令牌将更改为常规文本Tag而不是令牌[Tag]。 / p>
如果有人能解决上述问题,我很乐意阅读。