gpt4 book ai didi

objective-c - NSTokenField 不触发操作

转载 作者:行者123 更新时间:2023-12-03 16:16:27 25 4
gpt4 key购买 nike

我有一个 NSTokenField 来向对象(文档)添加标签。我想在将 token 添加到 token 字段时(键入 token 化字符时)使用新标签更新对象。不幸的是这似乎不起作用。NSTokenField 连接到我的 Controller 中的一个操作,但从未调用此操作方法。

我还有一个 NSTextField 以相同的方式连接到 Controller ,并调用 Controller 中的操作方法。

我也尝试过通过键值观察:

- (void) awakeFromNib {
[tokenField addObserver:self forKeyPath:@"objectValue" options:NSKeyValueObservingOptionNew context:NULL];
}


- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([object isEqual:tokenField]){
NSLog(@"Tokens changed");
}
}

但只有当我以编程方式更改 token 时才会调用此操作。

tokenField 中的 token 发生更改时,如何通知我?

最佳答案

创建新标签时不会调用 NSTokenField 操作选择器。根据您在 Interface Builder 中进行的设置,当您按 Enter 结束编辑(Send On Enter Only)或结束编辑某些内容时,它会被调用。其他方式(结束编辑时发送)。为了获得您所追求的精细控制,您需要另一种方法。

<小时/>

将标记字符添加到标记字段时出现的蓝色标记称为文本附件(NSTextAttachment 的实例)。计算何时从 token 字段添加/删除标签的一种方法是跟踪 token 字段的基础属性字符串中包含的这些对象的数量变化。

要访问相关的属性字符串,您需要获取fieldEditorlayoutManager - 最终提供出现在 TextView 中的字符串的对象。获得后,每次收到 controlTextDidChange: 消息时,计算其 attributedStringstring 表示形式中文本附件的数量>。如果这次的数量大于上次计数记录的数量,则刚刚添加了标签。

#import "AppDelegate.h"

@interface AppDelegate ()

@property (weak) IBOutlet NSWindow *window;
@property (weak) NSLayoutManager *lm;
@property (nonatomic) NSUInteger tokenCount;

@end

@implementation AppDelegate

// The text in the fieldEditor has changed. If the number of attachments in the
// layoutManager's attributedString has changed, either a new tag has been added,
// or an existing tag has been deleted.
-(void)controlTextDidChange:(NSNotification *)obj {
NSUInteger updatedCount = [self countAttachmentsInAttributedString:self.lm.attributedString];
if (updatedCount > self.tokenCount) {
NSLog(@"ADDED");
self.tokenCount = updatedCount;
} else if (updatedCount < self.tokenCount) {
NSLog(@"REMOVED");
self.tokenCount = updatedCount;
}
}

// About to start editing - get access to the fieldEditor's layoutManager
-(BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor {
self.lm = [(NSTextView *)fieldEditor layoutManager];
return YES;
}

// Iterate through the characters in an attributed string looking for occurrences of
// the NSAttachmentCharacter.
- (NSInteger)countAttachmentsInAttributedString:(NSAttributedString *)attributedString {
NSString *string = [attributedString string];
NSUInteger maxIndex = string.length - 1;
NSUInteger counter = 0;

for (int i = 0; i < maxIndex + 1; i++) {
if ([string characterAtIndex:i] == NSAttachmentCharacter) {
counter++;
}
}
return counter;
}

@end

关于objective-c - NSTokenField 不触发操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28395047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com