我想要一个NSTokenField
包含纯文本和标记的。这与this question中的问题相同,但那里的答案并没有为我解决。也许我错过了一些东西,或者苹果在发布这些答案后的 5 年内改变了一些东西。
具体来说,假设我想输入“hello%tok%”并让它变成这样:
为了尝试消除混淆的机会,我总是使用以下类之一的自定义表示对象,而不是纯字符串......
@interface Token : NSObject
@end
@implementation Token
@end
@interface WrappedString : NSObject
@property (retain) NSString* text;
@end
@implementation WrappedString
@end
这是我的委托方法:
- (NSString *)tokenField:(NSTokenField *)tokenField
displayStringForRepresentedObject:(id)representedObject
{
NSString * displayString = nil;
if ([representedObject isKindOfClass: [WrappedString class]])
{
displayString = ((WrappedString*)representedObject).text;
}
else
{
displayString = @"TOKEN";
}
return displayString;
}
- (NSTokenStyle)tokenField:(NSTokenField *)tokenField
styleForRepresentedObject:(id)representedObject
{
NSTokenStyle theStyle = NSPlainTextTokenStyle;
if ([representedObject isKindOfClass: [Token class]])
{
theStyle = NSRoundedTokenStyle;
}
return theStyle;
}
- (NSString *)tokenField:(NSTokenField *)tokenField
editingStringForRepresentedObject:(id)representedObject
{
NSString * editingString = representedObject;
if ([representedObject isKindOfClass: [Token class]])
{
editingString = nil;
}
else
{
editingString = ((WrappedString*)representedObject).text;
}
return editingString;
}
- (id)tokenField:(NSTokenField *)tokenField
representedObjectForEditingString:(NSString *)editingString
{
id repOb = nil;
if ([editingString isEqualToString:@"tok"])
{
repOb = [[[Token alloc] init] autorelease];
}
else
{
WrappedString* wrapped = [[[WrappedString alloc]
init] autorelease];
wrapped.text = editingString;
repOb = wrapped;
}
return repOb;
}
当我输入“hello”时,没有调用任何委托方法,这似乎是合理的。当我键入第一个“%”时,有 3 个委托调用:
tokenField:representedObjectForEditingString:
获取字符串“hello”并将其转换为WrappedString
表示形式。tokenField:styleForRepresentedObject:
得到它WrappedString
并返回NSPlainTextTokenStyle
。tokenField:editingStringForRepresentedObject:
获取WrappedString
并返回“你好”。
前两个电话似乎是合理的。我不确定数字 3,因为令牌应该是可编辑的,但它还没有被编辑。我原以为tokenField:displayStringForRepresentedObject:
会被调用,但事实并非如此。
当我键入“tok”时,不会调用任何委托方法。当我键入第二个“%”时,tokenField:representedObjectForEditingString:
会收到字符串“hellotok”,我原本希望看到的只是“tok”。所以我从来没有机会创建圆形令牌。
如果我以另一个顺序键入文本“%tok%hello”,那么我确实得到了预期的结果,一个圆形标记,后跟简单的“hello”。
顺便说一句,令牌字段编程指南说
请注意,为纯文本标记样式配置的每个标记字段只能有一个标记。
这似乎意味着不可能自由混合纯文本和令牌。