我已经尝试了一个简单的第一个 NSTokenField 示例,它使用基于文档的 ARC 使用应用程序,使我的 Document 类成为 NSTokenFieldDelegate。它可以工作,但有一个原因:委托方法 tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem: 只看到 indexOfToken 的值为 0,即使我成功编辑了一个不是标记字符串中第一个标记的标记。我在 OS X 10.8.2 上使用 XCode 4.5 和 10.8 框架。
问题:为什么总是0?我希望它是用户正在编辑的字段中间接看到的标记数组 0 .. n - 1 中标记的索引。
要重现,如上所述启动项目并添加以下文本,然后使用 XIB 编辑器并将 NSTokenField 拖到文档窗口上,将令牌字段设置为文档的令牌字段,并使文档实例成为令牌字段的代表。
文档.h:
#import <Cocoa/Cocoa.h>
@interface Document : NSDocument <NSTokenFieldDelegate>
{
IBOutlet NSTokenField *tokenField; // of (Token *).
NSMutableDictionary *tokens; // of (Token *).
}
@end
令牌.h:
#import <Foundation/Foundation.h>
@interface Token : NSObject
@property (strong, nonatomic) NSString *spelling;
- (id)initWithSpelling:(NSString *)s;
@end
令牌.m:
#import "Token.h"
@implementation Token
@synthesize spelling;
- (id)initWithSpelling:(NSString *)s
{
self = [super init];
if (self)
spelling = s;
return self;
}
@end
文档.m:
#import "Document.h"
#import "Token.h"
@implementation Document
- (id)init
{
self = [super init];
if (self) {
tokens = [NSMutableDictionary dictionary];
}
return self;
}
...
#pragma mark NSTokenFieldDelegate methods
- (NSArray *)tokenField:(NSTokenField *)tokenField
completionsForSubstring:(NSString *)substring
indexOfToken:(NSInteger)tokenIndex
indexOfSelectedItem:(NSInteger *)selectedIndex
{
NSLog(@"tokenField:completionsForSubstring:\"%@\" indexOfToken:%ld indexOfSelectedItem:",
substring, tokenIndex);
NSMutableArray *result = [NSMutableArray array];
for (NSString *key in tokens) {
//NSLog(@"match? \"%@\"", key);
if ([key hasPrefix:substring])
[result addObject:key];
}
return result;
}
- (id)tokenField:(NSTokenField *)tokenField representedObjectForEditingString:(NSString *)editingString
{
NSLog(@"tokenField:representedObjectForEditingString:\"%@\"", editingString);
Token *token;
if ((token = [tokens objectForKey:editingString]) == nil) {
token = [[Token alloc] initWithSpelling:editingString];
[tokens setObject:token forKey:editingString];
//NSLog(@"token %@", [token description]);
NSLog(@"tokens %@", [tokens description]);
}
return token;
}
- (NSString *)tokenField:(NSTokenField *)tokenField displayStringForRepresentedObject:(id)representedObject
{
NSString *spelling = [representedObject spelling];
NSLog(@"tokenField:displayStringForRepresentedObject: = \"%@\"", spelling);
return spelling;
}
@end
令牌的输入以换行符或逗号字符终止。