2017-03-07 7 views
1

그래서 내가 사용자를 물어보고 싶은 모달 시트에 첫 번째로 반응을 설정 : NSTextField있는과 시도 후 훨씬 더 기능모달 대화 상자에 시트, 무언가를 통해

class MyTextView : NSTextView { 
    override func viewWillDraw() { 
     dispatch_async(dispatch_get_main_queue()) { 
      self.window?.makeFirstResponder(self) 
     } 
    } 
} 

private func requestNotification() { 
    let alert = NSAlert() 
    alert.alertStyle = NSAlertStyle.InformationalAlertStyle 
    alert.messageText = "Enter your email address" 

    let urlField = MyTextView.init(frame: NSMakeRect(0,0,300,28)) 
    let urlScroll = NSScrollView.init(frame: NSMakeRect(0,0,300,28)) 
    urlScroll.hasVerticalScroller = true 
    urlScroll.autohidesScrollers = true 
    urlField.drawsBackground = true 
    urlField.editable = true 

    urlScroll.documentView = urlField 
    alert.accessoryView = urlScroll 

    alert.addButtonWithTitle("Send") 
    alert.addButtonWithTitle("Cancel") 

    alert.beginSheetModalForWindow(self.window!, completionHandler: { response in 
     if response == NSAlertFirstButtonReturn { 
      // Send 
      let view = (alert.accessoryView as! NSScrollView).documentView as! NSTextView 
      let text = view.string! as String 
      self.webViewController.loadAlmostURL(text) 
     } 
    }) 
} 

합니다.

적어도 상호 작용은 입력으로 시작되지만 텍스트보기의 경계를 지정하고 싶습니다.

+0

음, 하위 클래스라는 NSTextField있는을 내가 처음 응답자 수를하지만 뭔가 아니었다처럼 편집이 겹쳐 오른쪽으로로드; 나는 이것을 원본으로 업데이트 할 것이다. – slashlos

+0

대신 NSTextView 사용; 그러나이 경우 스크롤보기에 삽입해야하는 또 다른 문제가 발생합니다. 수직 스크롤이 나타날 수 있도록 제약 조건이 필요합니다. – slashlos

답변

0

코드 스 니펫은 NSTextField처럼 테두리 rect를 제외하고는 거의 모든 것을 수행합니다.

0

NSTextField를 사용하여이 작업을 수행하려고하면 viewWillDraw를 반복적으로 호출하면 깜박이는 커서가 방해 받고 대화 상자를 탭킹하는 것처럼 보입니다. 이 문제를 해결하려면, 한 번만 firstResponder을 설정 viewWillDraw 루틴이 같은 플래그를 설정 :

class AlertTextField : NSTextField { 

    var doOnce = true 
    override func viewWillDraw() { 
     if doOnce { 
      DispatchQueue.main.async() { 
       self.window?.makeFirstResponder(self) 
       self.doOnce = false 
      } 
     } 
    } 
}