Cocoa不调用ViewController函数

时间:2017-02-25 04:00:25

标签: cocoa swift3 macos-sierra nscombobox

我构建了一个带有组合框的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方法被调用。它返回显示的字符串。然后我的objectValueForItemAt被调用。它返回显示的条目。
  3. 我点击了Tab键。我的textShouldEndEditing被调用,它很高兴并返回一个有效的响应。光标移动到下一个字段。
  4. 我退出视图控制器 - 它是一个模态对话框 - 然后输入一个不起作用的对话框。光标出现在第一个字段中,即非工作组合框。
  5. 我输入字母m。我的findFristOccurance方法被调用。它返回显示的字符串。我的objectValueForItemAt未被调用。
  6. 当我跳出字段并调用textShouldEndEditing时,它会返回invalid,因为没有选择,即-1。
  7. 我知道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语句,那么源控制器有五个并选择保持一致。

1 个答案:

答案 0 :(得分:0)

找到它。我有:

func comboBox(aComboBox: NSComboBox, indexOfItemWithStringValue string: String) -> Int {

而不是正确的:

func comboBox(_ aComboBox: NSComboBox, indexOfItemWithStringValue string: String) -> Int {

在Swift 3.0之前复制教程或stackoverflow答案时,我已多次遇到此问题。 Xcode捕获了大量过时的用法,但不是这种类型。如果未调用您的函数,请检查此项。我有一段时间没有遇到这个问题并且自满了。