2017-02-25 2 views
1

내가 글자를 입력 할 때 해당 문자로 시작하는 목록에서 첫 번째 항목을 찾을 수 있도록 완료 옵션이있는 콤보 상자로 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 
  1. . 커서가 작업 콤보 박스 인 첫 번째 필드에 나타납니다.
  2. 문자 m을 입력합니다. 내 findFristOccurance 메서드가 호출됩니다. 표시된 문자열을 리턴합니다. 그럼 내 objectValueForItemAt가 호출됩니다. 표시된 항목을 리턴합니다.
  3. 나는 탭 키를 친다. 내 textShouldEndEditing이 호출되고 행복하며 유효한 응답을 반환합니다. 커서가 다음 필드로 이동합니다.
  4. 보기 컨트롤러를 종료합니다 (모달 대화 상자). 작동하지 않는 컨트롤러를 입력하십시오. 커서가 작동하지 않는 콤보 상자 인 첫 번째 필드에 나타납니다.
  5. 문자 m을 입력합니다. 내 findFristOccurance 메서드가 호출됩니다. 표시된 문자열을 리턴합니다. 내 objectValueForItemAt는 호출되지 않습니다.
  6. 필드 밖으로 나가서 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 
} 

, 소스 컨트롤러는 다섯을 가지고 있으며, 일관성 유지를 선택합니다.

+0

데이터 소스가 동일한 객체입니까? – Willeke

+0

아니요. 실제 데이터는 응용 프로그램에 로컬 인 Rails 서버가있는 MySQL 데이터베이스에 있습니다. 응용 프로그램에서 데이터는 사전의 배열로 저장됩니다. – curt

답변

0

발견. 나는했다 : 대신 올바른의

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

을 :

튜토리얼 또는 스위프트 3.0 이전에 유래 답변을 복사 할 때 나는이 문제를 여러 번 했어요
func comboBox(_ aComboBox: NSComboBox, indexOfItemWithStringValue string: String) -> Int { 

. Xcode는 많은 오래된 사용법을 포착하지만이 유형은 사용하지 않습니다. 함수가 호출되지 않으면이를 확인하십시오. 나는 잠시 문제가 없었으며 만족하지 못했습니다.