您不应该为此混用方法。这是已弃用的行为。这将影响您应用程序中的所有窗口,而不仅仅是您想要更改的窗口。但是,您应该做的是已经将 NSWindow 子类化,然后在运行时更改该窗口的类。这可以使用这个运行时函数来完成:
Class object_setClass(id object, Class cls)
参考在这里:http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/uid/TP40001418-CH1g-SW12
您的代码应如下所示:
object_setClass(theWindow, [MyWindowSubclass class]);
您可能遇到的问题是该窗口已经是 NSWindow 的子类。如果是这种情况,有更复杂的方法可以实现这一点。您可以在运行时动态构造一个类。这里还有一些代码。鉴于该窗口是目标窗口:
Class newWindowClass = objc_allocateClassPair([window class], "MyHackyWindowSubclass", 0);
Method upMethod = class_getInstanceMethod(newWindowClass, @selector(keyUp:));
method_setImplementation(upMethod, new_NSWindow_keyUp_);
object_setClass(window, newWindowClass);
我不完全确定这不会改变超类的实现。该文档对此有点不具体。但是,您仍然应该尝试一下。如果不行,把第二行和第三行换成这个:
class_replaceMethod(newWindowClass, @selector(keyUp:), new_NSWindow_keyUp_, "v@:@");
在任何情况下,您都需要定义新的方法实现。它可能看起来像这样(部分由 KennyTM 提供):
void new_NSWindow_keyUp_(NSWindow* self, SEL _cmd, NSEvent* evt) {
[super keyUp: evt];
... // do your changes
}