2018년 2월 20일 화요일

NSTextField Cheatsheet

이 글은 NSTextField 에 관한 여러 체감형(?) 팁을 모은 것이며 관련된 지식 습득 시 업데이트 될 가능성이 있다. ;-)

How to detect update of Text Field

텍스트필드의 내용이 바뀌는 것을 감지하기 원할 때는 - 마치 iOS와 비슷하게 - NSTextField 의 delegate 를 사용 해야 할 것 같은데 NSTextFieldDelegate 메뉴얼 에서는 텍스트 업데이트와 관련된 부분은 없어서 의아했다. 사실 NSControl 에 정의된 controlTextDidChange 메소드를 만들어서 위임해 주면 된다. 아래는 특정 뷰컨트롤러에 이를 구현해 본 예제이다.
class MyViewController: NSViewController {
    ...

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        myTextField.delegate = self
    }

    ...
}

extension MyViewController: NSTextFieldDelegate {
    override func controlTextDidChange(_ obj: Notification) {
        guard let textField = obj.object as? NSTextField, textField == myTextField
        else { return }

        let value = textField.stringValue
        ...
    }
}
텍스트필드가 여러 개 라면 위의 controlTextDidChange 오버라이드 메소드에서 guard 문을 이용하는 방식으로 구분하는 것이 가능하다. 아 참고로 예제처럼 굳이 extension 으로 분리할 의무(?)는 없다. ;-)

How to detect pressing Enter Key

텍스트필드에서 엔터키를 눌렀을 때를 처리하고자 할 때는 두 가지 방법을 쓸 수 있는데 첫째는 역시 NSControl 에 정의된 controlTextDidEndEditing 메소드를 오버라이드 할 수 있다.
extension MyViewController: NSTextFieldDelegate {
    override func controlTextDidEndEditing(_ obj: Notification) {
        ...
    }
}
둘째는 인터페이스 빌더나 스토리보드에서 액션 아웃렛(Action Outlet)을 만들어 주는 방법이다.
class MyViewController: NSViewController {
    ...
    @IBAction func textFieldAction(_ sender: Any) {
        ...
    }
}
둘 다 엔터키가 눌리면 반응한다. 그리고 둘 다 텍스트 필드에 포커스가 갈 때도 반응한다는 공통적인 특징이 있으니 주의하자.

[관련글] macOS & Cocoa Development Resources
[관련글] 스위프트(Swift) 가이드

댓글 없음 :