gpt4 book ai didi

objective-c - 抑制 NSTextField 的文本完成下拉列表

转载 作者:搜寻专家 更新时间:2023-10-30 20:07:02 24 4
gpt4 key购买 nike

我正在尝试使用 completes == YES、没有按钮和 numberOfVisibleItems == 0 创建 NSComboBox 的效果(例如,尝试填写iTunes 的“获取信息”窗口中的专辑或艺术家)。

为了实现这一点,我使用了一个 NSTextField 控件,它在 -controlTextDidChange: 上自动完成以调用 -[NSTextField complete:],这会触发委托(delegate)方法:

- (NSArray *)control:(NSControl *)control
textView:(NSTextView *)textView
completions:(NSArray *)words
forPartialWordRange:(NSRange)charRange
indexOfSelectedItem:(NSInteger *)index;

我已经让这个工作正常,唯一的问题是下拉菜单显示的副作用。我想压制它,但我还没有找到办法做到这一点。我已经搜索了文档、Internet 和 Stack Overflow,但没有成功。

我更喜欢委托(delegate)方法,但我愿意接受子类化,如果那是唯一的方法的话。我的目标是 Lion,以防它有帮助,因此解决方案不需要向后兼容。

最佳答案

为了解决这个问题,我不得不跳出框框思考一下。我没有使用内置的自动完成机制,而是构建了自己的。这并不像我最初想象的那么艰难。我的 -controlTextDidChange: 看起来像这样:

- (void)controlTextDidChange:(NSNotification *)note {
// Without using the isAutoCompleting flag, a loop would result, and the
// behavior gets unpredictable
if (!isAutoCompleting) {
isAutoCompleting = YES;

// Don't complete on a delete
if (userDeleted) {
userDeleted = NO;
} else {
NSTextField *control = [note object];
NSString *fieldName = [self fieldNameForTag:[control tag]];
NSTextView *textView = [[note userInfo] objectForKey:@"NSFieldEditor"];

NSString *typedText = [[textView.string copy] autorelease];
NSArray *completions = [self comboBoxValuesForField:fieldName
andPrefix:typedText];

if (completions.count >= 1) {
NSString *completion = [completions objectAtIndex:0];

NSRange difference = NSMakeRange(
typedText.length,
completion.length - typedText.length);
textView.string = completion;
[textView setSelectedRange:difference
affinity:NSSelectionAffinityUpstream
stillSelecting:NO];
}
}

isAutoCompleting = NO;
}
}

然后我实现了另一个我以前不知道的委托(delegate)方法(可以说是拼图缺失的部分)。

- (BOOL)control:(NSControl *)control
textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
// Detect if the user deleted text
if (commandSelector == @selector(deleteBackward:)
|| commandSelector == @selector(deleteForward:)) {
userDeleted = YES;
}

return NO;
}

更新:简化和更正的解决方案

它现在不跟踪用户输入的最后一个字符串,而是检测用户何时删除。这以直接而非迂回的方式解决了问题。

关于objective-c - 抑制 NSTextField 的文本完成下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7040843/

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