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

Mac开发基础10-NSViewController(二)

时间:2024-08-06 15:06:42浏览次数:10  
标签:10 coder self 视图 Mac NSViewController super view

1. View-Based UI Updates

NSViewController 提供了很多优化 UI 更新的方法。利用这些方法,你可以更有效地管理复杂视图的改变。

viewWillLayout

该方法在控制器的视图层次结构布局之前调用,可以在此方法中修改子视图的布局。

Objective-C
- (void)viewWillLayout {
    [super viewWillLayout];
    // 执行布局前需要的操作
    NSLog(@"View will layout");
}
Swift
override func viewWillLayout() {
    super.viewWillLayout()
    // 执行布局前需要的操作
    print("View will layout")
}

updateViewConstraints

通过重写这个方法可以动态更新约束。

Objective-C
- (void)updateViewConstraints {
    [super updateViewConstraints];
    // 更新视图的约束
    NSLog(@"Updating view constraints");
}
Swift
override func updateViewConstraints() {
    super.updateViewConstraints()
    // 更新视图的约束
    print("Updating view constraints")
}

2. 错误状态显示

NSViewController 可以利用自己的状态显示错误信息,比如网络请求错误或数据解析错误。

使用 presentError

Objective-C
- (void)someMethodThatMayFail {
    NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain code:101 userInfo:@{NSLocalizedDescriptionKey: @"Something went wrong"}];
    [self presentError:error];
}
Swift
func someMethodThatMayFail() {
    let error = NSError(domain: NSCocoaErrorDomain, code: 101, userInfo: [NSLocalizedDescriptionKey: "Something went wrong"])
    self.presentError(error)
}

3. 自定义 storyboardIdentifier

在 Storyboard 中为视图控制器定义唯一标识符,然后在代码中动态加载。

设置和使用 storyboardIdentifier

Objective-C
NSViewController *vc = [self.storyboard instantiateControllerWithIdentifier:@"MyViewController"];
Swift
let vc = self.storyboard?.instantiateController(withIdentifier: "MyViewController") as! NSViewController

4. 深入理解 prepare(for:sender:) 方法

NSViewController 中,prepare(for:sender:) 方法一般用来在界面转场之前传递数据或者设定状态。

Objective-C

- (void)prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"mySegue"]) {
        MyDestinationViewController *destinationVC = segue.destinationController;
        destinationVC.data = self.dataToSend;
    }
}

Swift

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if segue.identifier == "mySegue" {
        let destinationVC = segue.destinationController as! MyDestinationViewController
        destinationVC.data = self.dataToSend
    }
}

5. Restoration 恢复视图控制器状态

NSViewController 支持状态恢复机制,使得应用退出后再启动时可以恢复到之前的状态。

启用状态恢复

Objective-C
- (void)viewDidLoad {
    [super viewDidLoad];
    self.restorationIdentifier = NSStringFromClass([self class]);
}

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
    [super encodeRestorableStateWithCoder:coder];
    // 保存需要恢复的状态
    [coder encodeObject:self.someState forKey:@"someState"];
}

- (void)restoreStateWithCoder:(NSCoder *)coder {
    [super restoreStateWithCoder:coder];
    // 恢复之前保存的状态
    self.someState = [coder decodeObjectForKey:@"someState"];
}
Swift
override func viewDidLoad() {
    super.viewDidLoad()
    self.restorationIdentifier = String(describing: type(of: self))
}

override func encodeRestorableState(with coder: NSCoder) {
    super.encodeRestorableState(with: coder)
    // 保存需要恢复的状态
    coder.encode(self.someState, forKey: "someState")
}

override func restoreState(with coder: NSCoder) {
    super.restoreState(with: coder)
    // 恢复之前保存的状态
    self.someState = coder.decodeObject(forKey: "someState") as? SomeType
}

6. 自定义转场动画

通过 NSViewControllerTransitionOptions,可以在切换视图时自定义动画效果。

自定义动画

Objective-C
- (void)switchToViewController:(NSViewController *)toViewController {
    NSViewController *fromViewController = self.childViewControllers.firstObject;
    [self addChildViewController:toViewController];
    [self transitionFromViewController:fromViewController toViewController:toViewController options:NSViewControllerTransitionSlideLeft completionHandler:^{
        [fromViewController removeFromParentViewController];
    }];
}
Swift
func switchToViewController(_ toViewController: NSViewController) {
    let fromViewController = self.children.first!
    self.addChild(toViewController)
    self.transition(from: fromViewController, to: toViewController, options: .slideLeft, completionHandler: {
        fromViewController.removeFromParent()
    })
}

7. 视图层级捕捉和截图

需要时可以捕捉视图内容并保存为图片,用于调试或临时保存视图状态。

捕捉视图

Objective-C
- (NSImage *)captureView:(NSView *)view {
    NSRect rect = view.bounds;
    NSBitmapImageRep *rep = [view bitmapImageRepForCachingDisplayInRect:rect];
    [view cacheDisplayInRect:rect toBitmapImageRep:rep];
    return [[NSImage alloc] initWithCGImage:[rep CGImage] size:rect.size];
}
Swift
func captureView(_ view: NSView) -> NSImage {
    let rect = view.bounds
    let rep = view.bitmapImageRepForCachingDisplay(in: rect)!
    view.cacheDisplay(in: rect, to: rep)
    return NSImage(cgImage: rep.cgImage!, size: rect.size)
}

8. 处理视图的层级和顺序

使用 subviews 属性可以操作视图的层级和顺序。

Objective-C
- (void)bringSubviewToFront:(NSView *)view {
    [view.superview addSubview:view positioned:NSWindowAbove relativeTo:nil];
}
Swift
func bringSubviewToFront(_ view: NSView) {
    view.superview?.addSubview(view, positioned: .above, relativeTo: nil)
}

标签:10,coder,self,视图,Mac,NSViewController,super,view
From: https://www.cnblogs.com/chglog/p/18345173

相关文章

  • Windows 和 MacOS 上安装配置ADB(安卓调试桥)_android adb工具安装 mac
    一、Android调试桥(ADB)Android调试桥(ADB)是一款多功能命令行工具,它让你能够更便捷地访问和管理Android设备。使用ADB命令,你可以轻松执行以下操作网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!在设备上安装、复制和删除文件;安装应用程序;录制设备屏幕或截......
  • 利用Motrix下载度盘资源,速度可达100MB/S
    面对百度网盘资源下载慢、限速等问题,许多用户一直在寻找更高效的解决方案。之前推荐的一款ODE多功能助手,因为API接口被封而无法正常使用。因此,今天给大家带来一款全新的下载神器——Motrix。这款开源下载管理器不仅支持多种协议,还能实现快速下载,让你不再为下载速度头疼!Mo......
  • 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......
  • 洛谷P1081【NOIP2012提高组】开车旅行
    题目见[NOIP2012提高组]开车旅行-洛谷(懒得打题目了)我们直接上代码#include<iostream>#include<cstdlib>#include<cstdio>#include<cmath>#include<cstring>#include<iomanip>#include<algorithm>#include<ctime>#include<queue>......
  • 加密市场再遭重创:多重利空因素引发超10亿美元抛售潮
    四年前的全球“熔断潮”仿佛还在眼前,如今金融市场再度迎来剧烈震荡,全球股市与加密货币市场遭遇多重利空冲击,尤其是比特币和以太坊的闪崩使得市场恐慌情绪蔓延。这个“黑色星期一”不仅见证了股市的跳水,还标志着加密市场的又一次大规模清算与资金出逃。加密市场大幅下挫:超10亿......
  • 【推荐100个unity插件之24】Post Processing 后处理插件最全基础使用说明
    文章目录前言什么是后处理?场景视图显示后处理效果主相机勾选渲染后处理Post-processVolume和Volume的区别内置渲染管线的后处理Post-processVolume使用通用渲染管线(URP)的后处理是Volume的使用文档升级URPglobalvolume全局后处理效果泛光(Bloom)色差(Chromatic......
  • Salesforce常见的100+个业内术语!(系列二)
    在上周的文章中,我们开启了Salesforce业内术语的科普和盘点,并介绍了各领域通用的一些术语。前文指路......
  • 效率何止10倍!利用输入法瞬间调用提示词
    我们在日常工作/学习/生活有很多场景需要使用提示词,比如说:快速总结文章快速排版解释概念翻译其它经常面对的任务但是使用提示词有几个痛点:你很难临时写一个非常完整的提示词你凑合写的提示词,又担心结果不满意如果已经保存了完备的提示词,复制粘贴又很麻烦有没有办法在我......