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
  1. 我激活控制器。光标出现在第一个字段中,这是工作组合框
  2. 我输入字母 m。我的 findFristOccurance 方法被调用。它 return 是显示的字符串。然后调用我的 objectValueForItemAt。它 return 是显示的条目。
  3. 我按了 Tab 键。我的 textShouldEndEditing 被调用,它很高兴并且 return 是一个有效的响应。光标移动到下一个字段。
  4. 我退出视图控制器——它是一个模态对话框——然后输入不起作用的那个。光标出现在第一个字段中,这是不起作用的组合框。
  5. 我输入字母 m。我的 findFristOccurance 方法被调用。它 return 是显示的字符串。我的 objectValueForItemAt 没有被调用。
  6. 当我跳出字段并调用 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 捕获了很多过时的用法,但不是这种类型。如果你的函数没有被调用,检查这个。我有一段时间没有遇到这个问题并且自满了。