특정 기존의 코코아 창을 닫고 자체 처리기를 추가하려고합니다 (실제로 닫거나 다른 작업을 수행 할 수 있음).오버라이드 윈도우 닫기 동작
나는 이것을 수행 할 때 다른 해결책을 가지고있었습니다. 하나는 :
기존의 Cocoa 윈도우의 윈도우 닫기 버튼을 런타임시 자신의 코드를 추가 할 수있는 자신 만의 닫기 위젯으로 바꾸고 싶습니다.
import objc
_NSThemeCloseWidget = objc.lookUpClass("_NSThemeCloseWidget")
def find_close_widget(window):
contentView = window.contentView()
grayFrame = contentView.superview()
for i in range(len(grayFrame.subviews())):
v = grayFrame.subviews()[i]
if isinstance(v, _NSThemeCloseWidget):
return v, i, grayFrame
class CustomCloseWidget(_NSThemeCloseWidget):
pass
def replace_close_widget(window, clazz=CustomCloseWidget):
v, i, grayFrame = find_close_widget(window)
newv = clazz.alloc().init()
grayFrame.subviews()[i] = newv
그러나이 꽤 잘하지 않는 것 :
는 지금,이 코드가 있습니다. (충돌합니다.)
NSWindowDelegate 프로토콜을 사용하지 않는 이유가 있습니까? 닫는 동작을 수정하려면 windowShouldClose 또는 windowWillClose를 사용 하시겠습니까? –
나는 동의한다 - 그것은 대표자들이하는 것이다. 그래서 파이프 라인을 만드는 의사 결정을 할 수 있습니다 ... – bryanmac
내가 필요로하는 지점에 새 대리자를 설정할 수 없습니다. 그러나, 나는 windowShouldClose 정도가 될 수 있습니다. 그런데 실제로 그 행동을 어떻게 바꿀 수 있습니까? (어떤 경우에는 닫히지 않을뿐만 아니라 때로는 어떤 행동을해야합니다.) – Albert