NSViewController 是 macOS 开发中的一个核心类,属于 AppKit 框架,用于管理一个视图 (NSView) 及其生命周期。在开发 macOS 应用时,经常用到 NSViewController 来组织界面逻辑。
常见用途
1、控制界面内容
控制一个完整的 macOS 界面区域(如设置窗口、侧边栏等)。
2、响应用户操作
管理按钮、输入框、表格等视图的交互逻辑。
3、作为容器控制器
例如使用 splitViewController、tabViewController 时嵌套多个子控制器。
4、界面生命周期管理
viewDidLoad():视图加载后调用
viewWillAppear():视图即将出现
viewDidDisappear():视图消失后调用
常用属性
1、view:NSView类型,控制器管理的主视图,通常在 loadView() 中初始化。
2、parent:NSViewController?类型,父控制器(如果有)。
3、children:[NSViewController]类型,当前控制器的子控制器。
4、representedObject:Any?类型,用于绑定数据模型,类似 MVVM 中的 viewModel。
5、title:String类型,控制器的标题,通常用于窗口标题或文档标题。
6、nibName:NSNib.Name?类型,如果是通过 XIB 创建,表示 XIB 的名字。
7、storyboard:NSStoryboard?类型,如果是通过 Storyboard 创建,表示所属 Storyboard。
8、view.window:NSWindow?类型,表示该控制器所管理视图所在的窗口。
生命周期方法
1、loadView():创建并设置 view 属性,必须重写(如果不使用 XIB/Storyboard)。
2、viewDidLoad():视图加载后调用(类似 iOS),用于初始化逻辑。
3、viewWillAppear():视图即将显示时调用。
4、viewDidAppear():视图已显示。
5、viewWillDisappear():视图即将移除时调用。
6、viewDidDisappear():视图已从界面移除。
7、updateViewConstraints():用于更新视图的 Auto Layout 约束。
8、viewWillLayout():在布局前调用。
9、viewDidLayout():在布局后调用。
控制器嵌套管理
1、addChild(_:):添加一个子控制器。
2、removeFromParent():从父控制器中移除自身。
3、insertChild(_:at:):在指定位置插入子控制器。
界面更新和数据绑定
1、representedObject:数据模型绑定点,通常配合观察者(KVO)使用。
2、invalidateRestorableState():通知系统,当前状态需要重新保存。
3、restoreState(with:):恢复状态,通常用于状态保存/恢复场景。
使用示例(Swift)
class MyViewController: NSViewController {
override func loadView() {
// 创建并设置控制器的主视图
self.view = NSView()
self.view.wantsLayer = true
self.view.layer?.backgroundColor = NSColor.white.cgColor
}
override func viewDidLoad() {
super.viewDidLoad()
print("视图已加载")
let button = NSButton(title: "点我", target: self, action: #selector(buttonClicked))
button.frame = NSRect(x: 50, y: 50, width: 100, height: 40)
view.addSubview(button)
}
@objc func buttonClicked() {
print("按钮点击")
}
}
配合NSWindow窗口显示
let vc = MyViewController()
let window = NSWindow(contentViewController: vc)
let windowController = NSWindowController(window: window)
windowController.showWindow(nil)
总结
NSViewController和其他的ViewController一样,都是包装NSView提供一个控制功能,管理整个视图的生命周期。