내가 글자를 입력 할 때 해당 문자로 시작하는 목록에서 첫 번째 항목을 찾을 수 있도록 완료 옵션이있는 콤보 상자로 viewcontroller를 만들었습니다. 그것은 잘 작동합니다. 그런 다음 코드를 다른보기 컨트롤러에 복사하고 적절한 소스 정보를 변경했습니다. 작동하지 않습니다. 나는 지금 2 일간을 비교해 봤는데, 나는 무엇이든 놓친 것을 볼 수 있었고 모두 괜찮아 보인다. 문제를 분리하기 위해 여러 가지 진술을했습니다. 이 컨트롤러 모두를 통해 실행의 콘솔 로그입니다 : 내가 컨트롤러를 활성화코코아 호출하지 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가 문제 컨트롤러에서 호출되지 않는 것으로 보입니다. 스토리 보드에서 두 콤보 박스를 비교했습니다. 둘 다 동일하게 설정됩니다. 내가 누락 된 설정이 있습니까?
두 컨트롤러에서 발산되기 전에 마지막 함수가 호출됩니다. 이 버전은 문제가 컨트롤러에서입니다 : 경우에 당신은 단지 하나의 항목으로 switch 문에 대해 궁금
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
}
, 소스 컨트롤러는 다섯을 가지고 있으며, 일관성 유지를 선택합니다.
데이터 소스가 동일한 객체입니까? – Willeke
아니요. 실제 데이터는 응용 프로그램에 로컬 인 Rails 서버가있는 MySQL 데이터베이스에 있습니다. 응용 프로그램에서 데이터는 사전의 배열로 저장됩니다. – curt