我用具有完成选项的组合框构建了一个视图控制器,这样当我输入一个字母时,它会在列表中找到以该字母开头的第一个出现。它工作正常。然后我将代码复制到另一个视图控制器并更改了适当的源信息。它不起作用。几天来我一直在比较这两者,看看我是否遗漏了什么,一切看起来都还不错。我已经放入了一些打印语句来隔离问题。这是通过两个控制器运行的控制台日志:
// 1
completed string starting. Tag: 1
// 2
Starting findFirstOccurrence parm string: m
findFirstOccurrence dataRow: ["style_id": 61, "name": Ma (She's Making Eyes at Me), "id": 1040, "year_written": <null>, "year_published": <null>, "notes": <null>]
findFirstOccurrence returning: Ma (She's Making Eyes at Me)
objectValueForItemAt index: 1637
entry: Ma (She's Making Eyes at Me)
// 3
Entered textShouldEndEditing - tag: 1 selectedRow: 1637
// 4
initializeDialog creditRow: ["record_id": 485]
completed string starting. Tag: 1
// 5
Starting findFirstOccurrence parm string: m
findFirstOccurrence dataRow: ["other_instruments": <null>, "name": Maucha Adnet, "last_name": Adnet, "primary_instrument": vocals, "id": 2368, "first_name": Maucha, "birth_year": <null>, "death_year": <null>, "notes": <null>]
findFirstOccurrence returning: Maucha Adnet
// 6
Entered textShouldEndEditing - tag: 1 selectedRow: -1
- 我激活控制器。光标出现在第一个字段中,这是工作组合框
- 我输入字母 m。我的 findFristOccurance 方法被调用。它返回显示的字符串。然后我的 objectValueForItemAt 被调用。它返回显示的条目。
- 我按了tab键。我的 textShouldEndEditing 被调用,它很高兴并返回一个有效的响应。光标移动到下一个字段。
- 我退出视图控制器——它是一个模态对话框——然后进入那个不起作用的对话框。光标出现在第一个字段中,即非工作组合框。
- 我输入字母 m。我的 findFristOccurance 方法被调用。它返回显示的字符串。我的 objectValueForItemAt 没有被调用。
- 当我跳出该字段并调用 textShouldEndEditing 时,它返回无效,因为没有选择,即-1。
我知道问题控制器中的 objectValueForItemAt 是可以的,因为当我单击组合框上的向下箭头以显示条目时,它会被重复调用。
问题似乎是问题控制器中没有调用 objectValueForItemAt。我已经比较了故事板中的两个组合框。它们都设置相同。我在某处缺少某些设置吗?
这是两个控制器在分歧之前调用的最后一个函数。此版本来自问题控制器:
func comboBox(_ aComboBox: NSComboBox, completedString string: String) -> String? {
print("completed string starting. Tag: ", aComboBox.tag)
var returnString = ""
switch aComboBox.tag {
case artistTableTag:
returnString = findFirstOccurrence(table: artists.table, string: string)
default:
break
}
return returnString
}
func findFirstOccurrence(table: [[String: Any]], string: String) -> String {
print("Starting findFirstOccurrence parm string: ", string)
var returnString = ""
for var dataRow in table {
let dataString = dataRow["name"] as! String
if dataString.commonPrefix(with: string,
options: String.CompareOptions.caseInsensitive).lengthOfBytes(using: String.Encoding.utf8) ==
string.lengthOfBytes(using: String.Encoding.utf8) {
print("findFirstOccurrence dataRow: ", dataRow)
returnString = dataRow["name"] as! String
break
}
}
print("findFirstOccurrence returning: ", returnString)
return returnString
}
如果您想知道只有一个条目的 switch 语句,源控制器有五个并选择保持一致。