2017-09-07 3 views
0

내 NSViewController 내용이 변경 될 때마다 알림을 실행하는 NSTexField가 있습니다.텍스트 변경에 대한 신속한 macOS 알림

또한 IBActions가 NSTextField에 문자를 쓰도록 정의 된 버튼이 여러 개 있습니다. 그러나 단추 중 하나를 누를 때마다 NSTextField가 업데이트됩니다. 알림은 시작되지 않습니다.

수동으로 NSControlTextDidChange 이벤트를 발생시키는 방법은 무엇입니까? 이 맥 응용 프로그램이기 때문에

override func controlTextDidChange(_ notification: Notification) { 
    if let textField = notification.object as? NSTextField { 
     filterTable(with: textField.stringValue) 
    } 
} 

@IBAction func pressedKeyButton(_ sender: NSButton) { 
    let character = sender.title 
    self.searchTextField.stringValue.append(character) 
    self.searchTextField.textDidChange(Notification(name: .NSControlTextDidChange,object: nil)) 
} 
+0

"self.searchTextField.textDidChange (Notification (name : .NSControlTextDidChange, object : nil))"란 무엇입니까? 귀하의 controlTextDidChange가 맞지 않는 것 같습니다. –

+0

pressedKeyButton 동작이 트리거되면 NSTexField의 내용은 업데이트되지만 controlTextDidChange 함수는 트리거되지 않습니다. –

답변

1

, 당신은 텍스트 필드를 채울 코코아 바인딩을 사용하여이 훨씬 간단 할 수 있습니다. , 바인딩 관리자에서 인터페이스 빌더에서, 그리고

@objc dynamic var searchString: String = "" { 
    didSet { /* put notification code here */ } 
} 

을 "모델 키와, 텍스트 필드의 Value 뷰 컨트롤러에 바인딩 바인딩 : 간단하게 이렇게처럼 didSet 블록 뷰 컨트롤러에서 dynamic 속성을 선언 경로 "를 searchString으로 설정하십시오. 또한 "계속 업데이트 값"확인란을 선택합니다. 자신의 코드에서 텍스트 필드에 직접 액세스하는 대신 searchString 속성을 변경하여 텍스트 필드를 업데이트하십시오 (텍스트 필드의 콘센트를 제거 할 수도 있습니다. 더 이상 필요하지 않을 수도 있습니다). 텍스트 필드에 표시된 문자열에 대한 모든 변경 내용이 이제 searchString 속성을 통과하므로 해당 블록의 didSet 블록이 항상 호출되며 일관되게 통보됩니다.