我構建了一個帶有完成選項的組合框的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
- 我激活控制器。光標出現在第一個字段中,這是工作組合框
- 我鍵入字母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語句只有一個入口,源控制器有五個選擇保持一致。
數據源是同一個對象嗎? – Willeke
否。實際數據位於Rails服務器前端的MySQL數據庫中,該服務器位於應用程序本地。在應用程序中,數據存儲在字典數組中。 – curt