特定の既存のCocoaウィンドウを閉じて、独自のハンドラを追加しようとします(本当に閉じるか、または別の何かをする可能性があります)。オーバーライドウィンドウのクローズ動作
私はこれを行うにあたって、さまざまな解決策を思いついていました。 1つは、
実行時に既存の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