コンボボックスでコンボボックスを作成しました。コンボボックスには完了オプションがあり、文字を入力するとその文字で始まるリスト内で最初に出現するものが見つかりました。それはうまく動作します。その後、コードを別のView Controllerにコピーし、適切なソース情報を変更しました。それは動作しません。私は何かを逃したかどうかを確認するために2つの日の2つを比較してきました、そして、それはすべてOKと思われます。私は、問題を特定するためにいくつかの印刷ステートメントを入れました。これは、コントローラの両方を介して実行のコンソールログである:私はコントローラを有効ココアが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が呼び出されます。表示されたエントリを返します。
- 私はタブキーを押しました。私のtextShouldEndEditingが呼び出され、それがうれしくて有効な応答を返します。カーソルが次のフィールドに移動します。
- 私はビューコントローラを終了します。これはモーダルダイアログです。動作しないダイアログを入力します。最初のフィールドにカーソルが表示されます。これは動作していないコンボボックスです。
- 文字mを入力します。私のfindFristOccuranceメソッドが呼び出されます。表示された文字列を返します。私のobjectValueForItemAtは呼び出されません。
- フィールドからタブアウトし、textShouldEndEditingが呼び出されると、選択がないため-1が返され、無効になります。
私はコンボボックスの下矢印をクリックしてエントリを表示すると繰り返し呼び出されるので、問題のコントローラではobjectValueForItemAtはOKです。
問題は、問題のコントローラで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文に疑問を抱いている場合は、元のコントローラは、5つがあり、一貫性の維持を選択します。
データソースは同じオブジェクトですか? – Willeke
いいえ。実際のデータは、アプリケーションのローカルにあるRailsサーバーの前にあるMySQLデータベースにあります。アプリでは、データは辞書の配列に格納されます。 – curt