Objective c NSTextField自动完成/建议

Objective c NSTextField自动完成/建议,objective-c,autocomplete,nsarray,nstextfield,Objective C,Autocomplete,Nsarray,Nstextfield,因为有几天我试图为NSTextField编写一个自动完成代码。自动完成应该是这样的,当用户单击NSTextfield时,TextField下应该显示一个列表,列出哪些可能性可用。在输入一个字母或数字后,列表应该会随着可能性而刷新 此列表中的建议应来自NSMutableArray或NSMutableDictionary 此自动完成/自动建议方法应适用于MAC应用程序。您可以使用NSComboBox。您还需要在IB中设置其Autocompletes属性,或在code中设置[comboBox setC

因为有几天我试图为
NSTextField
编写一个自动完成代码。自动完成应该是这样的,当用户单击NSTextfield时,TextField下应该显示一个列表,列出哪些可能性可用。在输入一个字母或数字后,列表应该会随着可能性而刷新

此列表中的建议应来自
NSMutableArray
NSMutableDictionary


此自动完成/自动建议方法应适用于MAC应用程序。

您可以使用
NSComboBox
。您还需要在IB中设置其
Autocompletes
属性,或在code中设置
[comboBox setCompletes:YES]
。 请记住,它是区分大小写的

但是,如果您需要按照您描述的方式进行操作,则需要通过子类化
NSWindowController
NSTableView
来创建列表,并将它们更改为列表或菜单,以便在
NSTextField
下显示。设置
NSTextField
的委托,并在文本更改时执行搜索和列表更新

在这种情况下,请避免使用
NSMenu
,因为它会在您键入时带走文本字段的焦点

苹果在一份声明中提到了这一点。 他们解释了带有建议菜单的文本字段以及如何使其工作。他们还在网站上提供了示例代码


您可以找到示例代码。

您可以使用
NSComboBox
。您还需要在IB中设置其
Autocompletes
属性,或在code中设置
[comboBox setCompletes:YES]
。 请记住,它是区分大小写的

但是,如果您需要按照您描述的方式进行操作,则需要通过子类化
NSWindowController
NSTableView
来创建列表,并将它们更改为列表或菜单,以便在
NSTextField
下显示。设置
NSTextField
的委托,并在文本更改时执行搜索和列表更新

在这种情况下,请避免使用
NSMenu
,因为它会在您键入时带走文本字段的焦点

苹果在一份声明中提到了这一点。 他们解释了带有建议菜单的文本字段以及如何使其工作。他们还在网站上提供了示例代码


您可以找到示例代码。

您可以使用
NSComboBox
。您还需要在IB中设置其
Autocompletes
属性,或在code中设置
[comboBox setCompletes:YES]
。 请记住,它是区分大小写的

但是,如果您需要按照您描述的方式进行操作,则需要通过子类化
NSWindowController
NSTableView
来创建列表,并将它们更改为列表或菜单,以便在
NSTextField
下显示。设置
NSTextField
的委托,并在文本更改时执行搜索和列表更新

在这种情况下,请避免使用
NSMenu
,因为它会在您键入时带走文本字段的焦点

苹果在一份声明中提到了这一点。 他们解释了带有建议菜单的文本字段以及如何使其工作。他们还在网站上提供了示例代码


您可以找到示例代码。

您可以使用
NSComboBox
。您还需要在IB中设置其
Autocompletes
属性,或在code中设置
[comboBox setCompletes:YES]
。 请记住,它是区分大小写的

但是,如果您需要按照您描述的方式进行操作,则需要通过子类化
NSWindowController
NSTableView
来创建列表,并将它们更改为列表或菜单,以便在
NSTextField
下显示。设置
NSTextField
的委托,并在文本更改时执行搜索和列表更新

在这种情况下,请避免使用
NSMenu
,因为它会在您键入时带走文本字段的焦点

苹果在一份声明中提到了这一点。 他们解释了带有建议菜单的文本字段以及如何使其工作。他们还在网站上提供了示例代码


您可以找到示例代码。

只需添加到@AbcdEfg的答案中,为了使NSComboBox不区分大小写,您可以将其子类化并重写其[completedString:]方法,如下所示:

- (NSString *) completedString:(NSString *)string {
  NSUInteger l = [string length];
  if (!!l)
    for (NSString *match in [self objectValues])
      if ([[match commonPrefixWithString:string options:NSCaseInsensitiveSearch] length] == l)
        return [match stringByReplacingCharactersInRange:NSMakeRange(0, l) withString:string];

  return nil;
}

只需添加到@AbcdEfg的答案中,为了使NSComboBox不区分大小写,您可以将其子类化并覆盖其[completedString:]方法,如下所示:

- (NSString *) completedString:(NSString *)string {
  NSUInteger l = [string length];
  if (!!l)
    for (NSString *match in [self objectValues])
      if ([[match commonPrefixWithString:string options:NSCaseInsensitiveSearch] length] == l)
        return [match stringByReplacingCharactersInRange:NSMakeRange(0, l) withString:string];

  return nil;
}

只需添加到@AbcdEfg的答案中,为了使NSComboBox不区分大小写,您可以将其子类化并覆盖其[completedString:]方法,如下所示:

- (NSString *) completedString:(NSString *)string {
  NSUInteger l = [string length];
  if (!!l)
    for (NSString *match in [self objectValues])
      if ([[match commonPrefixWithString:string options:NSCaseInsensitiveSearch] length] == l)
        return [match stringByReplacingCharactersInRange:NSMakeRange(0, l) withString:string];

  return nil;
}

只需添加到@AbcdEfg的答案中,为了使NSComboBox不区分大小写,您可以将其子类化并覆盖其[completedString:]方法,如下所示:

- (NSString *) completedString:(NSString *)string {
  NSUInteger l = [string length];
  if (!!l)
    for (NSString *match in [self objectValues])
      if ([[match commonPrefixWithString:string options:NSCaseInsensitiveSearch] length] == l)
        return [match stringByReplacingCharactersInRange:NSMakeRange(0, l) withString:string];

  return nil;
}

谢谢你的描述。这对我来说似乎很难。你有教程或代码示例吗?@Robby不客气,我编辑了答案并添加了示例代码和相关WWDC会话的链接,他们在该会话的某个时候解释了代码。是;)我试过NSComboBox,但我认为它对我的项目不好,因为组合框对于我的数据量来说太大了。我将尝试使用NSTextField和NSTableView的第二种方法。我现在对一个NSTextField进行了子类化,并在我的故事板上创建了它。我超越了方法
-(BOOL)成为第一响应者。我在里面写了
[Label setHidden:NO];NSLog(@“ABC”)当我选择NSTextField时,它会在控制台中打印“ABC”,TableView应该显示在该字段下,但它不会隐藏标签。为什么代码的行为是这样的?谢谢你的描述。这对我来说似乎很难。你有教程或代码示例吗?@Robby不客气,我编辑了答案并添加了示例代码和相关WWDC会话的链接,他们在该会话的某个时候解释了代码。是;)我试过NSComboBox,但我觉得它对我的身体不好