macOS管理视图的NSViewController
macOS管理视图的NSViewController

macOS管理视图的NSViewController

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提供一个控制功能,管理整个视图的生命周期。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注