2017-11-18 10 views
-1

나는 몇 가지 조건이 충족 될 때 열 수 팝업 메뉴를 방지 할 필요가 있기 때문에 메뉴를 열 수하려고 할 때 나는 알고 "willOpenMenu"을 구현 :방지 NSPopUpButton는 메뉴를 엽니 다

class MyPopUpButton: NSPopUpButton { 
    override func willOpenMenu(_ menu: NSMenu, with event: NSEvent) { 
     print("willOpenMenu") 
     // it fires, but what I can do to prevent menu to be opened?? 
    } 
} 

방법 메뉴가 표시되지 않도록 방지 할 수 있습니까? 당신이 "값"열이 나는 방법을 발견 enter image description here

마지막으로

enter image description here

+3

버튼을 사용 중지 하시겠습니까? 그러나 당신은이 방법으로 그렇게하지 않을 것입니다; 이 방법이 호출되기 전에 당신은 그것을 할 수 있습니다. "조건이 충족 될 때까지 버튼을 비활성화 상태로 유지하십시오. 유효성 검사, 바인딩 등에 대해 알아보십시오. – matt

+0

mmh, 다음 번에 버튼을 활성화해야합니다 (다시 확인하십시오). 버튼을 사용할 수 없으면이 문제가 발생합니까? – Mike97

+0

님이 이전에 댓글을 편집했습니다. 이 팝업은 개요보기 안에 있습니다 (plist 편집기입니다). 내가 나쁜 말을했기 때문에 버튼을 사용할 수 없도록 만들면된다. – Mike97

답변

0

편집 아래 팝업 (유형 열)를 클릭하면

아래 편집 은 순서대로 어떤 일이 발생 :

override func willOpenMenu(_ menu: NSMenu, with event: NSEvent) { 
    if (self.outline != nil) { 
     /* 
     the following is needed when user click on the type column: 
     He can have ongoing edits on some rows, so changing first responder 
     We can aesily inform the outline that We're playing with something else 
     and have to force ask the user in case edits are wrong. 
     This also prevent a crash. 
     */ 
     if (self.outline?.wrongValue)! { 
      // this grant the popup menu to not showup (or disappear so quickly) 
      menu.cancelTrackingWithoutAnimation() 
     } 
     self.window?.makeFirstResponder(self) 
     self.window?.makeFirstResponder(self.outline) 
    } 
} 

self.outline은 get/set 변수입니다.

override func controlTextDidBeginEditing(_ obj: Notification) { 
    if obj.object is MyTextField { 
     self.outline.wrongValue = true 
    } 
} 

    override func controlTextDidEndEditing(_ obj: Notification) { 
     if obj.object is MyTextField { 
      /* 
      some code here to check if stringValue is ok for the selected tag, otherwise 
      show the relative alert, the popup menu will not show up anymore 
      because cancelTracking is called on it 
      */ 
      self.outline.wrongValue = false 
     } 
    } 

cancelTracking() 키이었다 "wrongvalue는"이 방식으로 작동합니다!