Cocoa 未调用 ViewController 函数
Cocoa Not Calling ViewController Function
我构建了一个 viewcontroller 组合框,该组合框具有完成选项,因此当我键入一个字母时,它会在列表中找到以该字母开头的第一个匹配项。它工作正常。然后我将代码复制到另一个视图控制器并更改了适当的源信息。它不起作用。几天来我一直在比较这两者,看看我是否遗漏了什么,一切似乎都还不错。我已经输入了一些打印语句来隔离问题。这是通过两个控制器 运行 的控制台日志:
// 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 方法被调用。它 return 是显示的字符串。然后调用我的 objectValueForItemAt。它 return 是显示的条目。
- 我按了 Tab 键。我的 textShouldEndEditing 被调用,它很高兴并且 return 是一个有效的响应。光标移动到下一个字段。
- 我退出视图控制器——它是一个模态对话框——然后输入不起作用的那个。光标出现在第一个字段中,这是不起作用的组合框。
- 我输入字母 m。我的 findFristOccurance 方法被调用。它 return 是显示的字符串。我的 objectValueForItemAt 没有被调用。
- 当我跳出字段并调用 textShouldEndEditing 时,它 return 无效,因为没有选择,即 -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 语句,源控制器有五个并选择保持一致。
找到了。我有:
func comboBox(aComboBox: NSComboBox, indexOfItemWithStringValue string: String) -> Int {
而不是正确的:
func comboBox(_ aComboBox: NSComboBox, indexOfItemWithStringValue string: String) -> Int {
在 Swift 3.0 之前,我在复制教程或 Whosebug 答案时遇到过几次这个问题。 Xcode 捕获了很多过时的用法,但不是这种类型。如果你的函数没有被调用,检查这个。我有一段时间没有遇到这个问题并且自满了。
我构建了一个 viewcontroller 组合框,该组合框具有完成选项,因此当我键入一个字母时,它会在列表中找到以该字母开头的第一个匹配项。它工作正常。然后我将代码复制到另一个视图控制器并更改了适当的源信息。它不起作用。几天来我一直在比较这两者,看看我是否遗漏了什么,一切似乎都还不错。我已经输入了一些打印语句来隔离问题。这是通过两个控制器 运行 的控制台日志:
// 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 方法被调用。它 return 是显示的字符串。然后调用我的 objectValueForItemAt。它 return 是显示的条目。
- 我按了 Tab 键。我的 textShouldEndEditing 被调用,它很高兴并且 return 是一个有效的响应。光标移动到下一个字段。
- 我退出视图控制器——它是一个模态对话框——然后输入不起作用的那个。光标出现在第一个字段中,这是不起作用的组合框。
- 我输入字母 m。我的 findFristOccurance 方法被调用。它 return 是显示的字符串。我的 objectValueForItemAt 没有被调用。
- 当我跳出字段并调用 textShouldEndEditing 时,它 return 无效,因为没有选择,即 -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 语句,源控制器有五个并选择保持一致。
找到了。我有:
func comboBox(aComboBox: NSComboBox, indexOfItemWithStringValue string: String) -> Int {
而不是正确的:
func comboBox(_ aComboBox: NSComboBox, indexOfItemWithStringValue string: String) -> Int {
在 Swift 3.0 之前,我在复制教程或 Whosebug 答案时遇到过几次这个问题。 Xcode 捕获了很多过时的用法,但不是这种类型。如果你的函数没有被调用,检查这个。我有一段时间没有遇到这个问题并且自满了。