首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将数据从简单NSView传递到SwiftUI视图: Ie event.keyCode案例

将数据从简单NSView传递到SwiftUI视图的方法有多种,以下是其中一种常见的方法:

  1. 创建一个自定义的ObservableObject类,用于存储要传递的数据。例如,可以创建一个名为DataModel的类。
代码语言:txt
复制
import SwiftUI
import Combine

class DataModel: ObservableObject {
    @Published var keyCode: Int = 0
}
  1. 在NSView中,创建一个DataModel实例,并将其作为环境对象传递给SwiftUI视图。
代码语言:txt
复制
import Cocoa
import SwiftUI

class CustomNSView: NSView {
    var dataModel: DataModel
    
    init(dataModel: DataModel) {
        self.dataModel = dataModel
        super.init(frame: .zero)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func keyDown(with event: NSEvent) {
        dataModel.keyCode = Int(event.keyCode)
    }
}

struct ContentView: View {
    @EnvironmentObject var dataModel: DataModel
    
    var body: some View {
        Text("Key Code: \(dataModel.keyCode)")
    }
}
  1. 在App的入口文件中,创建一个DataModel实例,并将其作为环境对象传递给SwiftUI视图。
代码语言:txt
复制
import SwiftUI

@main
struct MyApp: App {
    @StateObject private var dataModel = DataModel()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(dataModel)
        }
    }
}

这样,当在NSView中按下键盘时,会更新DataModel中的keyCode属性的值。SwiftUI视图ContentView会自动更新并显示最新的keyCode值。

这种方法的优势是可以实现数据的双向绑定,当DataModel中的数据发生变化时,SwiftUI视图会自动更新。同时,这种方法也适用于其他类型的数据传递,不仅限于键盘事件。

推荐的腾讯云相关产品:腾讯云云服务器(CVM)和腾讯云云原生应用引擎(TKE)。

  • 腾讯云云服务器(CVM):提供可扩展的计算容量,适用于各种应用场景。详情请参考:腾讯云云服务器
  • 腾讯云云原生应用引擎(TKE):用于部署和管理容器化应用程序,提供高可用性和弹性伸缩的容器集群。详情请参考:腾讯云云原生应用引擎
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SwiftUI中使用UIKit视图

在绘制屏幕时,会视图树的顶端开始对视图的body求值,如果其中还包含子视图则将递归求值,直到获得最终的结果。...在协调器中,我们可以通过双向绑定(Binding),通知中心(notificationCenter)或其他例如Redux模式的单项数据流等方式,UIKit视图内部的状态报告给SwiftUI框架或其他需要的模块...包装UITextField 本节中我们利用上面的知识实现一个具有简单功能的UITextField包装视图——TextFieldWrapper。...因此我们需要创建协调器,并在协调器中实现该方法,录入的内容传递给Demo视图中的name变量。...考虑尽量不将例程复杂化,我们使用UIColor、UIFont作为配置类型。SwiftUI的Color和Font转换成UIKit版本增加不小的代码量。

8.2K22

SwiftUI-数据

开发者不需要关心数据视图的状态同步工作,只需要关心数据的获取以及逻辑处理,使用起来非常简单,大大提高了开发效率。...@Binding 主要有两个作用: 在不持有数据源的情况下,任意读取。 @State 中获取数据应用,并保持同步。...不过值类型在传递时会发生复制操作,所以给传递后的值类型即使属性更新了也不会触发最初的传过来的值类型的重新赋值,所以界面并不会刷新,此时需要用@Binding,因为它可以值类型转为引用类型,这样在传递时...使用@EnvironmentObject,SwiftUI 立即在环境中搜索正确类型的对象。如果找不到这样的对象,则应用程序立即崩溃。...数据流图 从上图可以看出SwiftUI数据流转过程: 用户对界面进行操作,产生一个操作行为 action 该行为触发数据状态的改变 数据状态的变化会触发视图重绘 SwiftUI 内部按需更新视图

10.1K20

macOS AppKit 的事件响应简介

Apple event 我们以最常用的鼠标或键盘操作来说明事件传递应用的过程.当用户按下鼠标或者键盘时: 1.硬件设备首先检测到用户的这个操作,然后通过驱动程序这个操作动作转换为操作数据....2.驱动程序操作数据准备好之后,会调用macOS内核系统的I/O Kit,生成一个硬件级别的事件. 3.驱动程序这个事件发送到macOS系统的窗口服务的事件队列中. 4.驱动程序通知macOS的窗口服务...鼠标(或触控板)事件派发路径 前面已经提到过,一个NSWindow对象使用sendEvent:方法鼠标事件派发给用户操作的视图(NSView)对象.那么NSWindow是怎样识别是哪个NSView在被用户操作呢...NSApplication接收到Key equivalents(快捷键)事件时,会先传递给key window的视图(NSView)体系中,通过给每个对象发送performKeyEquivalent:消息来确认是否有控件响应此事件...Keyboard interface control,那么应用程序会将事件通过sendEvent:方法发送给kew window,然后窗口(key window)对象会调用第一响应者的keyDown:方法,事件传递整个响应链条中

2.6K60

高级 SwiftUI 动画 — Part 1:Paths

每当视图上的可动画参数发生变化时,SwiftUI 就会旧值新值制作动画。一些可动画的参数包括大小(size)、偏移(offset)、颜色(color)、比例(scale)等。...我们打算 0.3 0.8。该框架多次重新生成视图,以小幅度的增量来改变不透明度。...SwiftUI 已经为不透明度制作了动画,而不需要我担心这一切。是的,这是真的,但只要 SwiftUI 知道如何数值原点插值终点。对于不透明度,这是一个直接的过程,SwiftUI 知道该怎么做。...一旦我们把这两点做到位,我们将能够在任何数量的边数之间制作动画: 创建可动画数据(animatableData) 为了使形状可动画化,我们需要 SwiftUI 多次渲染视图,使用原点到目标数之间的所有边值...它基本上会将 SwiftUI 视图平铺到一个单一的 NSView/UIView 中,并用 Metal 进行渲染。跳到 WWDC 视频37:27 了解更多细节。

3.8K20

SwiftUI 布局协议 - Part2

当我们改变角度时,SwiftUI 会计算好每个视图最初和最终的位置,然后在动画期间内修改它们的位置,A点到B点成一条直线。...简单的说,通过添加 animatableData 属性到我们的布局,我们要求 SwiftUI 动画的每一帧重新计算布局。但是,在每个布局传递中,角度都会收到一个内插值。...我们的想法是信息视图流向布局,一会儿看见这一点是如何被逆转。 本节所解释的想法应谨慎使用,以避免布局循环和 CPU 峰值。在下一部分我将会解释原因和如何避免它。...过去我们在使用 GeometryReader 获取视图尺寸并传递视图的时候遇到过这个问题,然后父视图使用该信息去改变视图,即使用 GeometryReader 去再一次改变,然后我们就陷入了布局循环...当然它还提供了一个 0.0 1.0 的 pct 参数,当 pct == 0.0,视图将会展示轮子,当pct == 1.0,视图将会展示 sin波动。中间的数值将会穿插在两者的位置之中。

2.7K30

GeometryReader :好东西还是坏东西?

几何信息传递到上层视图,可能会引起不必要的视图更新。而向下传递信息,可以确保更新只在 GeometryReader 的闭包中进行。 GeometryReader 是布局容器吗,它的布局逻辑是什么?...( Required Size )返回给父视图 视图的建议尺寸作为自身的建议尺寸传递给子视图 视图的原点(0,0)置于 GeometryReader 的原点位置 其理想尺寸( Ideal Size...如果直接这些负数数据传递给 frame,就可能会出现布局异常(在调试状态下,Xcode 会用紫色的提示警告开发者)。因此,为了进一步避免这种极端情况,可以在传递数据时,将不符合要求的数据过滤掉。...因为在某些系统版本中, background 传递数据无法被 onPreferenceChange 获取到。...与其说避免使用,不如说用更加 SwiftUI 的方式来进行布局。

51870

Ask Apple 2022 与 SwiftUI 有关的问答(上)

是否有任何建议用来检测列表中的行选择,类似于 “NavigationLink”,但不导航另一个视图(例如,显示 Sheet 或列表中选择一个选项 )?...只有这些变量重构视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联的 @State 属性,将他们提取到一个结构中或许是好的选择。...在单元测试中,很难对 SwiftUI 视图中的依赖( 符合 DynamicProperty 协议 )进行测试。这也是 Redux-like 框架的优势之一( 状态视图中抽离出来,方便测试 )。...在我的例子中,不拖动时 0 75,拖动时 0 100。有什么办法可以阻止这种情况吗?A:你可以用 .chartYScale(domain: 0 ... 75) 锁定 Y 轴的刻度域。...事实上,这些视图( 惰性容器中的视图 )一旦被创建,其存续期持续惰性容器被销毁为止。请阅读 SwiftUI 视图的生命周期研究[12] 了解更多内容。

12.2K20

为什么SwiftUI视图使用结构体?

SwiftUI并非如此:我们更喜欢结构体用于整体视图,这有两个原因。 首先,有一个性能因素:结构体比类更简单,更快。...在UIKit中,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定其放置方式的约束,用于将其内容呈现其中的图层等等。...在SwiftUI中,我们所有的视图都是简单的结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数的结构体,则结构体的整个大小就是:一个整数。没有其他的。...通过生成不会随时间变化的视图SwiftUI鼓励我们转向更具功能性的设计方法:在数据转换为UI时,我们的视图变成简单的,惰性的东西,而不是会失去控制的智能化的东西。...当您查看可以作为视图的事物时,可以看到这一点。我们已经使用了Color.red和LinearGradient作为视图——包含很少数据简单类型。

3.1K10

SwiftUI geometryGroup() 指南:原理到实践

默认情况下,SwiftUI 视图会将位置和大小的变化沿视图层级向下传递,以至于只有绘制内容的视图(称为叶子视图当前动画应用到它们的框架矩形上。...SwiftUI 黄色圆形放置在放大后的红色矩形的 topLeading 位置。...本节涉及 transaction 以及 SwiftUI 动画的一些内部运行机制。...以上面的示例来说,在添加了 geometryGroup() 后,父视图( frame )并不是一次性的将自身几何属性的改变状态传递给了子视图,而是这些变化动画化了后,持续传递给子视图的。...https://cdn.fatbobman.com/geometryGroup-demo4_2023-11-27_09.52.07.2023-11-27%2009_53_12.gif 新创建的单元格根据父视图持续传递进来的几何信息

26010

避免 SwiftUI 视图的重复计算

通过 _makeProperty 方法,SwiftUI 得以实现在视图加载到视图树时,把所需的数据( 值、方法、引用等 )保存在 SwiftUI 的托管数据池中,并在属性图( AttributeGraph...当 SwiftUI 视图加载到视图树时,通过调用 _makeProperty 完成数据保存到托管数据池以及在属性图中创建关联的操作,并将数据在托管数据池中的引用保存在 _location ( AnyLocation...当 SwiftUI 视图视图树上删除时,会一并完成对 SwiftUI 数据池以及关联的清理工作。如此,使用 State 包装的变量,其存续期将与视图的存续期保持完全一致。...这是因为,我们 Student 类型作为参数传递给了子视图SwiftUI 在比对实例的时候,并不会关心子视图中具体使用了 student 中的哪个属性,只要 student 发生了变化,那么就会重新计算...为了解决这个问题,我们应该调整传递给子视图的参数类型和内容,仅传递视图需要的数据

9.2K81

React核心成员表示:JSX就是个错误

这里我们可以发现,衡量一门DSL(领域相关语言)优劣的标准有三点: 是否能直观描述视图状态 是否有灵活的编程能力 原生支持还是需要编译 让我们按这三个维度权衡几种不同平台的DSL: HTML 视图描述能力...接下来我们通过一个简单的「点击加一」的计数器来对比React与SwiftUI语法: React使用class语法: class Counter extends React.Component { state...同时,SwiftUI凭借强大的编程能力,原生实现React当前并不支持的功能: ? 比如,在React中,子组件要改变父组件的状态,需要父组件「状态」与「改变状态的方法」传递给子组件。...在SwiftUI中,子组件只需要将父组件传递的状态申明为@Binding,就能达到与父组件该状态「双向绑定」的效果。...比如上例的counter: // @State var counter = 0 // 变为 @Binding var counter 则计数器接受父组件传递的counter状态,子组件counter

1.2K30

在 Text 中实现基于关键字的搜索和定位

请阅读 优化在 SwiftUI List 中显示大数据集的响应效率[6] 以及 避免 SwiftUI 视图的重复计算[7] 两篇文章,了解更多有关性能优化方面的内容通过 currentPostion 获取需要滚动到的...了解更多内容,请阅读 SwiftUI 视图的生命周期研究[9] 一文优先定位于最靠近屏幕中央的搜索结果:/// List 当前显示中的 transcription 中就近选择 match 的 positionprivate...,我们通常会用两种方式添加搜索栏 —— 1、通过 VStack 搜索栏放置在 List 下方,2、使用 overlay 搜索栏放置在 List 视图的上层。...总结范例代码并没有十分刻意地创建规范的数据流,但由于做到视图数据分离,因此将其改写成任何你想使用的数据流方式并非难事。...尽管仅在搜索和 TranscriptionRow 视图注入两处对性能做了部分优化,但最终的流畅度已基本满足需求,也侧面证明了 SwiftUI 具备了相当的实战能力。

4.2K30

我庆幸果断放弃了SwiftUI:它还不够成熟

苹果传递出来的消息就像是说:“SwiftUI 是一个了不起的用户界面框架,而且 100% 绝对会成为苹果平台上应用开发的未来。”...这些年,也有一些用 SwiftUI 重写 UIKit 应用程序的案例,去年奈飞新版 iOS App 的登录界面也完全由 SwiftUI 重构。...本文的作者 chsxf,是一家独立游戏工作室的首席开发,也是 15 年的苹果用户,他想尝试 SwiftUI 放到自己的项目中,但是最终失败了。...但每当 SwiftUI 更新检查器视图时(这种更新可能出现在移动过程中,甚至是在输入文本字段的时候),渲染速率都会下降到每秒 10 15 帧,而且相当不稳定。这显然让人无法容忍。...我需要为每个上下文创建一个视图,这些视图同时又是其他视图的「子视图」,然后把需要的数据传递给特定视图

4.9K20

SwiftUI 的动画机制

0 : 1) 时序曲线函数( Animation )linear(duration:0.3) 意味着在 0.3 秒中对数据进行线性的转换(本例中为 0 1)。...视图和它子节点中的任何依赖项发生变化,都将满足启用动画插值计算的条件,并动画数据传递给作用范围内(视图和它子节点)的所有可动画部件。...AnimatablePair 类型,以便 SwiftUI 可以传递分属于不同依赖项的动画插值数据。...在传递插值数据时非常聪明,只会将发生变化的依赖项通过 animatableData 传递给可动画元素。...当修饰符 id 的值发生变化时,SwiftUI 将其作用的视图当前的视图结构中移除,并创建新的视图添加到原先所在的视图层次位置。因此,可以影响它的动画部件也是 AnyTransaction 。

14.7K40

如何在 SwiftUI 中创建条形图

很容易部分内容提取到子视图中,以便每个部分都很小且易于维护。包含 BarChartView 以及可能的其他文本或数据视图开始。...以下列表数据被作为主视图的项目数据,每一条数据包含一个对(名称,值)。在真正的 app 里,这里的数据应该通过 ViewModel model 里取数据。...width: 350, height: 500, alignment: .center) Spacer() } } } 更新 BarChartView 使数据可以作为参数传递...图标被设置为固定大小,视图被嵌入 ScrollView 中,以便在设备旋转时滚动。...SwiftUI 是一个很好的平台,用于创建视图和快速重构独立的子视图。在 SwiftUI 中构建条形图需要做一些工作,随着使用数据来试用条形图,可以确定更多的定制化。

5.1K10

为什么 SwiftUI视图使用结构体

SwiftUI 并非如此:我们更喜欢结构体用于整体视图,这有两个原因。 首先,有一个性能因素:结构体比类更简单,更快。...在 UIKit 中,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定其放置方式的约束,用于将其内容呈现其中的图层等等。...在 SwiftUI 中,我们所有的视图都是简单的结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数的结构体,则结构体的整个大小就是:一个整数。没有其他的。...通过生成不会随时间变化的视图SwiftUI 鼓励我们转向更具功能性的设计方法:在数据转换为 UI 时,我们的视图变成简单的,惰性的东西,而不是会失去控制的智能化的东西。...当您查看可以作为视图的事物时,可以看到这一点。我们已经使用了 Color.red 和 LinearGradient 作为视图——包含很少数据简单类型。

2.4K50

SwiftUI:使用 @EnvironmentObject 环境中读取自定义值

您已经了解了如何使用@State处理单个视图的局部状态,以及@ObservedObject如何使我们在视图之间传递一个对象,以便我们可以共享它。...好吧,@ EnvironmentObject更进一步:我们可以将对象放置环境中,以便任何子视图都可以自动访问它。...如果我们使用@ObservedObject,则需要将我们的对象每个视图传递下一个视图,直到它最终到达可以使用该视图视图E,这很烦人,因为B,C和D不在乎它。...使用@EnvironmentObject,视图A可以将对象放入环境中,视图E可以环境中读取对象,而视图B,C和D不必知道发生了什么。...好吧,您已经了解字典如何让我们使用一种类型作为键key,而另一种类型作为值。环境有效地使我们可以数据类型本身用作键,并将类型的实例用作值。

9.6K20

探讨 SwiftUI 中的几个关键属性包装器

在这篇文章中,我们探讨几个在 SwiftUI 开发中经常使用且至关重要的属性包装器。本文旨在提供对这些属性包装器的主要功能和使用注意事项的概述,而非详尽的使用指南。...它常用于简单的 UI 组件状态管理,如开关状态、文本输入等。 如果数据不需要复杂的跨视图共享,使用 @State 可以简化状态管理。...相关内容请阅读:SwiftUI Binding Extensions[9]。 // 一个 Binding<V?...引入 @StateObject 意味着所有相关操作都在主线程上进行( SwiftUI 会隐式为视图添加 @MainActor),包括异步操作。应将需要在非主线程上运行的代码应该视图代码中剥离。...它提供了一种便捷的方式在不同的视图层级中引入共享数据,而无需显式地通过每个视图的构造器传递。 典型应用场景 当需要在多个视图间共享同一个数据模型时,如用户设置、主题或应用状态。

21210

干货 | 关于SwiftUI,看这一篇就够了

本文主要从以下三个方面讲述SwiftUI的特性: 代码层面理解Swift 5.1新语法的底层实现; 数据流方面阐述SwiftUI的黑魔法; 布局原理层面阐述SwiftUI组件化的优势; 二、...不同场景中,SwiftUI提供了不同的关键词,其实现原理上如上文所示: @State - 视图数据存在依赖,数据变化要同步视图; @Binding - 父子视图直接有数据的依赖,数据变化要同步父子视图...响应式编程的核心是面向异步数据流和变化的,响应式编程所有事件转成为异步的数据流,更加方便的对这些数据流进行组合变换,最终只需要监听数据流的变化并做出处理即可,因此在SwiftUI中处理用户交互和响应等非常简洁...在组合视图中,闭包中会处理大量的UI组件,FunctionBuilder是通过闭包建立样式,闭包中的UI描述传递给专门的构造器,提供了类似DSL的开发模式。...单一、简单的响应视图组合到繁琐、复杂的视图中去,而且在Apple的任何平台上都能使用该组件,达到了跨平台(仅限苹果设备)的效果。按照用途大概能够分为基础组件、布局组件和功能组件。

5.9K10

如何在Xcode下预览含有Core Data元素的SwiftUI视图

如何在Xcode下预览含有Core Data元素的SwiftUI视图 SwiftUI诞生之日起,预览(Canvas Preview )一直是个让开发者又爱又恨的功能。...环境注入 SwiftUI提供了多种途径在视图之间传递数据。其中通过环境值(EnvironmentValue)或环境对象(EnvironmentObject)传递数据是其中使用量较大的两种方式。...通过采用单向数据流的方式,视图描述同数据逻辑进行分离。...因此,通常不推荐在视图中直接获取或操作Core Data数据(非常简单的应用除外)。...SwiftUI通常采用Redux的开发模式,通过获取到的Core Data数据转换成标准的Swift结构从而避免在视图中使用托管对象上下文或托管对象。

5.1K10
领券