2017-02-25 60 views
1

我構建了一個帶有完成選項的組合框的viewcontroller,這樣當我鍵入一個字母時,它會在列表中找到以該字母開頭的第一個事件。它工作正常。然後我將代碼複製到另一個視圖控制器並更改了適當的源信息。它不起作用。我已經比較了兩天,現在看看我是否錯過了一切,看起來一切正常。我已經輸入了一些打印語句來隔離問題。這是一個運行的控制檯日誌通過兩個控制器:可可未調用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時,由於沒有選擇即-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語句只有一個入口,源控制器有五個選擇保持一致。

+0

數據源是同一個對象嗎? – Willeke

+0

否。實際數據位於Rails服務器前端的MySQL數據庫中,該服務器位於應用程序本地。在應用程序中,數據存儲在字典數組中。 – curt

回答

0

找到它。我:

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

而不是正確的:

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

複製教程或之前雨燕3.0計算器的答案時,我有這個問題幾次。 Xcode捕獲了很多過時的用法,但不是這種類型。如果你的函數沒有被調用,請檢查這個。我一段時間沒有遇到這個問題,並且得意洋洋。