【问题标题】:NSTextField's autocompletion methodNSTextField 自动完成方法
【发布时间】:2011-06-19 18:39:10
【问题描述】:

我在为 NSTextfield 触发 complete: 方法时遇到问题。

现在我可以使用@distinctUnionOfObjects(删除数组重复项的绝妙方法)从文本字段中创建一个不同的名称数组,现在我可以使用:
- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index 发回此文本字段的自动完成功能

但是,这种方法不是自动的,我必须在数据输入过程中按 ESC 按钮来弹出文本字段的自动完成建议。

我在这里搜索了一些对我来说没有意义的例子。

小问题: 是否有任何使用 NSTexfields 代表(如 controlDidChanged 或类似方法)的方法可以更轻松、更清晰地做到这一点?

我只是混淆了使用 nstextview 的 complete: 方法。

【问题讨论】:

    标签: objective-c macos autocomplete delegates nstextfield


    【解决方案1】:

    我不建议复制整个字符串。这对您的情况很好,但是如果您对大型文本文件使用自动完成,那么您将遇到各种性能和内存问题。您可以跟踪您是否处于更新过程中。如果你有多个文本视图,你可以为 isCompleting 变量创建一个字典。

    - (void) controlTextDidChange: (NSNotification *)note {
        NSTextView * fieldEditor = [[note userInfo] objectForKey:@"NSFieldEditor"];
    
        if (!isCompleting) {
            isCompleting = YES;
            [fieldEditor complete:nil];
            isCompleting = NO;
        }
    }
    

    【讨论】:

      【解决方案2】:

      当您的文本字段委托获得controlTextDidChange: 时,您可以在Field Editor 上调用complete:。这是按 ESC 或 F5 时调用的方法。

      - (void) controlTextDidChange: (NSNotification *)note {
          NSTextView * fieldEditor = [[note userInfo] objectForKey:@"NSFieldEditor"];
      
          [fieldEditor complete:nil];
      }
      

      棘手的部分是,当导航完成菜单时,会导致再次发送controlTextDidChange: 消息(尽管不更改实际字符串),这将创建一个无限循环。当您已经在完成时,您将需要某种标志来阻止 complete: 被调用。例如,您可以跟踪用户对字符串所做的最后一次更改,并将其与字段编辑器的当前值进行比较;如果没有用户发起的更改,不要导致完成:

      BOOL textDidNotChange = [lastTypedString isEqualToString:[fieldEditor string]];
      
      if( textDidNotChange ){
          return;
      }
      else {
          lastTypedString = [[fieldEditor string] copy];
          [fieldEditor complete];
      }
      

      【讨论】:

      • @Josh Caswell, ...你认为这是完成这个极其简单的请求的聪明方法吗?
      • @Prooshani:我不明白你的评论。你觉得我描述的过程太复杂了?
      • @Josh Caswell,不,我的朋友,我只是想告诉你我以前读过这个技巧,我认为这是 xcode 的一个弱点,它让我为了一个用其他语言轻松处理的非常简单的请求!此外,您可以想象我有 22 个文本字段,并且必须为所有这些字段执行此操作!现在,你认为这是来自 Xcode 的聪明方法吗?注意:我之前在苹果的文档中读过这个技巧。
      • 无论如何,我试过这个:if ([aNotification object]== customerNameField) {bool customerNameDidChanged=[customerNameTemp isEqualToString:[customerNameField stringValue]];if (customerNameDidChanged==false) {customerNameTemp=[[customerNameField stringValue ]copy];NSTextView * fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"];[fieldEditor complete:nil];}},然后自动补全弹出,但它与我的文本重复输入名字的第一个单词!!!
      • @Proshani 这与 Xcode 无关。这就是该库/框架的设计方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2012-12-02
      • 2014-02-23
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多