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,但我觉得它对我的身体不好