2017-09-24 20 views
0

이라는 NSTextView에서 입력을 캡처하는 데 사용되는 응용 프로그램에 keyDown 함수가 있습니다. 일부 전환은 입력으로 수행되며 NSAttributedString으로 다시 입력되어 NSTextView에 다시 입력됩니다.keyDown이 NSTextView를 즉시 업데이트하지 않습니다.

현재 잘 작동하지만 문제는 다른 키를 누를 때까지 keyDown의 텍스트 상자에 입력 된 값이 textInput.textStorage?.string에 추가되지 않는다는 것입니다.

내가 textInput에 텍스트 abcde 아무것도 더를 입력 한 다음 func keyDown() 안에 내가 textInput.textStorage?.string에 액세스하려고 예를 들어

, 그것은 abcd를 반환합니다. 여기

는 불필요한 부분이없는 기능입니다 : keyUp의 문제가 있지만, 내가 keyUp를 사용한다면

override func keyDown(with event: NSEvent) { 
    let bottomBox = textInput.textStorage?.string // This returns one character short of what is actually in the text box 

    if let bottomBox = bottomBox { 
     var attribute = NSMutableAttributedString(string: bottomBox) 

     // Do some stuff here with bottomBox and attribute 

     // Clear and set attributed string 
     textInput.textStorage?.mutableString.setString("") 
     textInput.textStorage?.append(attribute) 
    } 
} 

,이 문제가되지 않는 사용자는 키 속성을 보유하고있는 경우 NSAttributedString에서 사용자가 키를 놓을 때까지 설정되지 않습니다.

keyDown 함수 중에 프로그래밍 방식으로 keyDown 이벤트를 해제하거나 keyUp 이벤트를 생성하는 방법이 있었지만 아무 것도 찾을 수없는 것 같습니다.

해결 방법이 있습니까?

+0

"응용 프로그램에 keyDown 함수가 있습니다." –

+0

keyDown 이벤트를 모니터링하는보기 컨트롤러 –

+0

NSEvent를 사용하지 마십시오. 알림을 사용하십시오. –

답변

1

내가 좋아하는 것은 코코아 바인딩을 속성 관찰자와 함께 사용하는 것입니다. 지금처럼 속성을 설정합니다

class MyViewController: NSViewController { 
    @objc dynamic var textInput: String { 
     didSet { /* put your handler here */ } 
    } 

    // needed because NSTextView only has an "Attributed String" binding 
    @objc private static let keyPathsForValuesAffectingAttributedTextInput: Set<String> = [ 
     #keyPath(textInput) 
    ] 
    @objc private var attributedTextInput: NSAttributedString { 
     get { return NSAttributedString(string: self.textInput) } 
     set { self.textInput = newValue.string } 
    } 
} 

는 이제 "지속적인 업데이트 값"확인란을 attributedTextInput에 텍스트 뷰를 결합 체크 :

enter image description here

잇, 자, 당신의 재산을 즉시 업데이트됩니다 캐릭터를 입력 할 때마다 속성의 didSet이 즉시 호출됩니다.

+0

대단히 감사합니다. 훌륭한 작품입니다. –