1.附上问题代码:
在app delegate中
// let rootVC = BaseViewController(nibName: "BaseViewController", bundle: nil)
// //设置窗口大小不可调整
// self.window?.isRestorable = false
// self.window?.setContentSize(NSSize(width: 720, height: 540))
// self.mainView.addSubview(rootVC.view)
// rootVC.view.mas_makeConstraints { (make) in
// make?.left.right()?.top()?.bottom()?.equalTo()(self.mainView)
// }
加载BaseViewController后,在BaseViewController添加了按钮,代码如下
let temp = NSButton()
self.view.addSubview(temp)
temp.mas_makeConstraints { (make) in
make?.left.equalTo()(self.view)?.offset()(16)
make?.top.equalTo()(self.view)?.offset()(100)
}
temp.setButtonType(.pushOnPushOff)
temp.bezelStyle = .regularSquare
temp.target = self
temp.action = #selector(printsomething)
temp.image = NSImage(named: "home_bar_hide")
实现事件:
@objc func printsomething() {
print("打印了一些东西")
}
然后运行,疯狂点击按钮,没一点反应。由于之前没做过macOS开发,只觉得是不是nsbutton哪个属性没设置对,于是又去看nsbutton的文档。没一点进展。后面在stack flow找到一点思路,博主回答事件没有响应,可能是target为空。可是上面代码明明设置了target = self 。为什么还是没有响应呢。
于是开始怀疑这个值是否真的为空。把nsbutton移到app delegate的window上来,发现事件是可以响应的。
再回去把BaseViewController 中的button的target设置成 self.view.window,发现app delegate中实现的事件是可以响应的。那么基本就可以确定是target的问题了。
原因:没有设置window的contentViewController。在所有教程中都是直接往window里面addsubview,到后面虽然界面是出来了,但是事件却没有响应对象。
解决办法:
不要在window中使用如下直接添加视图
// self.mainView.addSubview(rootVC.view)
// rootVC.view.mas_makeConstraints { (make) in
// make?.left.right()?.top()?.bottom()?.equalTo()(self.mainView)
// }
改为:
self.window.contentViewController = rootVC
问题解决。哎摸着石头过河,一步一个坑。