首页 > 其他分享 >Mac开发基础09-NSViewController(一)

Mac开发基础09-NSViewController(一)

时间:2024-08-06 15:08:55浏览次数:14  
标签:self 09 视图 Mac NSViewController Swift void view

NSViewController 简介

NSViewController 是 macOS 应用程序中的核心类,用于管理单个视图层次结构。它提供了对视图生命周期、布局管理和内容更新的控制,并与模型数据和其他控制器进行交互,提供了高效的视图控制和管理机制。

基础知识点

NSViewController 继承自 NSResponder,它主要用于以下几方面:

  1. 视图层次结构管理:管理视图及其子视图。
  2. 视图生命周期管理:管理视图的加载、显示、隐藏和销毁生命周期。
  3. 与数据模型交互:通过关联的模型数据来更新视图内容。
  4. 事件响应:处理用户交互事件。

常见 API 和方法

初始化与视图管理

初始化视图控制器

Objective-C
- (instancetype)initWithNibName:(NSNibName)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
Swift
init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?)

加载视图

会在视图第一次访问时调用,通常在这里执行一些视图初始化工作。

Objective-C
- (void)loadView {
    self.view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 200, 200)];
}
Swift
override func loadView() {
    self.view = NSView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))
}

视图生命周期

视图即将出现

Objective-C
- (void)viewWillAppear;
Swift
override func viewWillAppear() {
    super.viewWillAppear()
}

视图已经出现

Objective-C
- (void)viewDidAppear;
Swift
override func viewDidAppear() {
    super.viewDidAppear()
}

视图即将消失

Objective-C
- (void)viewWillDisappear;
Swift
override func viewWillDisappear() {
    super.viewWillDisappear()
}

视图已经消失

Objective-C
- (void)viewDidDisappear;
Swift
override func viewDidDisappear() {
    super.viewDidDisappear()
}

子视图管理

添加子视图控制器

Objective-C
- (void)addChildViewController:(NSViewController *)childViewController;
Swift
func addChild(_ childViewController: NSViewController)

移除子视图控制器

Objective-C
- (void)removeFromParentViewController;
Swift
func removeFromParent()

切换子视图控制器

Objective-C
- (void)transitionFromViewController:(NSViewController *)fromViewController
                    toViewController:(NSViewController *)toViewController
                             options:(NSViewControllerTransitionOptions)options
                           completionHandler:(void (^)(void))completion;
Swift
func transition(from fromViewController: NSViewController, to toViewController: NSViewController, options: NSViewController.TransitionOptions = [], completionHandler completion: (() -> Void)? = nil)

数据绑定和更新

绑定模型数据

可以使用 @IBOutlet@IBAction 将视图控件连接到代码中。

Objective-C
@interface MyViewController : NSViewController
@property (weak) IBOutlet NSTextField *textField;
@end

@implementation MyViewController

- (IBAction)buttonClicked:(id)sender {
    self.textField.stringValue = @"Button clicked!";
}

@end
Swift
class MyViewController: NSViewController {
    @IBOutlet weak var textField: NSTextField!
    
    @IBAction func buttonClicked(_ sender: Any) {
        textField.stringValue = "Button clicked!"
    }
}

自定义布局和自动布局

手动布局视图

Objective-C
- (void)viewDidLayout {
    [super viewDidLayout];
    self.view.subviews[0].frame = NSMakeRect(10, 10, 100, 100);
}
Swift
override func viewDidLayout() {
    super.viewDidLayout()
    self.view.subviews[0].frame = NSMakeRect(10, 10, 100, 100)
}

使用自动布局

Objective-C
- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSView *subview = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)];
    [subview setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.view addSubview:subview];
    
    [self.view addConstraints:@[
        [subview.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:10],
        [subview.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-10],
        [subview.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:10],
        [subview.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:-10]
    ]];
}
Swift
override func viewDidLoad() {
    super.viewDidLoad()
    
    let subview = NSView(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
    subview.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(subview)
    
    NSLayoutConstraint.activate([
        subview.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 10),
        subview.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -10),
        subview.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 10),
        subview.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -10)
    ])
}

视图交互和事件响应

响应用户事件

可以为视图添加手势识别器或继承 NSView 的事件方法。

Objective-C
- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSClickGestureRecognizer *clickRecognizer = [[NSClickGestureRecognizer alloc] initWithTarget:self action:@selector(handleClick:)];
    [self.view addGestureRecognizer:clickRecognizer];
}

- (void)handleClick:(NSGestureRecognizer *)gestureRecognizer {
    NSLog(@"View clicked!");
}
Swift
override func viewDidLoad() {
    super.viewDidLoad()
    
    let clickRecognizer = NSClickGestureRecognizer(target: self, action: #selector(handleClick(_:)))
    self.view.addGestureRecognizer(clickRecognizer)
}

@objc func handleClick(_ gestureRecognizer: NSGestureRecognizer) {
    print("View clicked!")
}

深入探讨

视图控制器生命周期

理解 NSViewController 的生命周期方法对正确处理视图的呈现和销毁非常重要。

  1. init(nibName:bundle:):初始化视图控制器。通常用于从 NIB/XIB 文件中加载视图。
  2. loadView:视图控制器的主视图在第一次访问时会调用该方法。这是设置视图层次结构的好时机。
  3. viewDidLoad:视图层次结构已载入到内存时调用。适用于额外的初始化工作,比如设置控件的初始状态。
  4. viewWillAppear:视图即将加入视图层级时调用。适用于每次视图显示前需要进行的操作,比如更新数据。
  5. viewDidAppear:视图已经加入视图层级时调用。适用于视图已经显示后的操作,比如启动动画。
  6. viewWillDisappear:视图即将从视图层级移除时调用。适用于移除前需要进行的操作,例如停止动画或者解除绑定。
  7. viewDidDisappear:视图已经从视图层级移除时调用。适用于视图已经消失后的操作,比如保存数据。

动态加载和卸载视图

在内存有限或者视图控件复杂的情况下,可以考虑动态加载和卸载部分视图。

Objective-C

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    if (self.isViewLoaded && !self.view.window) {
        self.view = nil;
    }
}

Swift

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    if self.isViewLoaded && self.view.window == nil {
        self.view = nil
    }
}

模块化开发和复用性

NSViewController 可以用于构建模块化的 UI 组件,使得各个部分可以独立开发和测试,然后再组合成完整的界面。

Objective-C

@interface CustomViewController : NSViewController
@end

@implementation CustomViewController

- (instancetype)init {
    if (self = [super initWithNibName:nil bundle:nil]) {
    }
    return self;
}

- (void)loadView {
    // 模块化视图初始化
    self.view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 200, 200)];
    // 添加更多子视图或控件
}

@end

Swift

class CustomViewController: NSViewController {
    override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // 初始化代码
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        // 初始化代码
    }
    
    override func loadView() {
        // 模块化视图初始化
        self.view = NSView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))
        // 添加更多子视图或控件
    }
}

通过掌握 NSViewController 的这些常见 API 和基础技巧,了解其视图生命周期和使用场景,能够灵活高效地管理 macOS 应用的视图层次结构,更好地实现复杂和模块化的用户界面。

标签:self,09,视图,Mac,NSViewController,Swift,void,view
From: https://www.cnblogs.com/chglog/p/18345144

相关文章

  • Mac开发基础10-NSViewController(二)
    1.View-BasedUIUpdatesNSViewController提供了很多优化UI更新的方法。利用这些方法,你可以更有效地管理复杂视图的改变。viewWillLayout该方法在控制器的视图层次结构布局之前调用,可以在此方法中修改子视图的布局。Objective-C-(void)viewWillLayout{[superview......
  • Windows 和 MacOS 上安装配置ADB(安卓调试桥)_android adb工具安装 mac
    一、Android调试桥(ADB)Android调试桥(ADB)是一款多功能命令行工具,它让你能够更便捷地访问和管理Android设备。使用ADB命令,你可以轻松执行以下操作网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!在设备上安装、复制和删除文件;安装应用程序;录制设备屏幕或截......
  • 洛谷P1209修理牛棚 Barn Repair
    [USACO1.3]修理牛棚BarnRepair题目描述在一个月黑风高的暴风雨夜,FarmerJohn的牛棚的屋顶、门被吹飞了好在许多牛正在度假,所以牛棚没有住满。牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜。有些牛棚里有牛,有些没有。所有的牛棚有相同的宽度。宽度为1自门遗失以后......
  • Mac开发基础08-NSWindow(二)
    NSWindow其他使用和技巧NSWindow是macOS应用程序中用于显示和管理窗口的核心类。可用于创建、编辑和管理应用程序的窗口。1.自定义窗口的内容视图层级替换默认的内容视图NSWindow默认包含一个内容视图,你可以使用自定义内容视图来替换它。Objective-CNSView*customVie......
  • Mac开发基础06-NSView(二)
    要理解NSView更深层的知识,涉及到其渲染机制、事件处理流程、与CALayer的关系及性能优化等方面。1.NSView绘制和渲染机制NSView的绘制过程主要依赖于drawRect:(Objective-C)或draw(_:)(Swift)方法。这个方法被调用是由系统驱动的,通常发生在需要重新绘制视图的时候,如窗口首次......
  • Mac开发基础05-NSView
    NSView概述NSView是macOS应用中所有用户界面元素的基类。它提供了一系列功能用于视图的绘制、事件处理、动画、自动布局等。1.基本属性bounds和framebounds描述了视图自身坐标系中的矩形区域,而frame描述了视图在其父视图坐标系中的矩形区域。Objective-CNSView*v......
  • Plugin Boutique Scaler EQ V1.1.3_WIN-TCD&MAC-HCiSO(2024.08更新),持续更新长期有效
    一。PluginBoutiqueScalerEQ1.1.3WIN-TCD&MAC-HCiSO   紧随屡获殊荣的音乐理论插件Scaler之后,ScalerEQ以一种引人注目的全新方式提供了音乐性和色彩的均衡。ScalerEQ是PluginBoutique推出的一款创新均衡器插件,结合传统和和声均衡功能,专注于音乐理论,为音乐制作和混......
  • interface关键字 day09
    /*java提供了一个关键字:interface,用来定义一个接口接口的主要作用是用来描述类的额外功能的。定义一个接口的语句定义格式:interface接口名{}需求:定义一个普通的狗类,和一个会骑车的狗类使用接口的注意事项:1、接口中只能出现抽象......
  • abstract关键字以及与public,final,static的关系 day09
    多态程序中,第一大前提要有继承关系。但是呢,比如上午写的动物案例,我们将狗,猫,猪这些具体的动物分别编写了一个类进行对应这都是没问题的。但是呢,动物本身应该是一个抽象的概念,我们在现实生活中其实是找到不到Animal的实例的。具体的事物,我们就可以使用java代码......
  • 驱动开发系列09 - Linux设备模型之设备,驱动和总线
    一:概述     Linux设备模型(LDM)是Linux内核中引入的一个概念。用于管理内核对象(那些需要引用计数的对象、例如文件、设备、总线甚至驱动程序),以及描述它们之间的层次结构,以及这些内核对象之间绑定关系。Linux设备模型引入了对象生命周期管理、引用计数、以及面向对象......