SwiftUI - 事件处理
事件处理是一个过程,在这个过程中,我们捕获一个事件,然后使用点击、手势、长按等方式响应该事件。SwiftUI 支持各种机制来处理事件,并可以根据用户的交互触发操作。
与使用繁重方法或委托来处理事件的传统 UI 框架不同,SwiftUI 使用轻量级方法来处理事件。换句话说,在 SwiftUI 中,我们可以直接在用户界面代码中定义事件处理程序,而不是创建单独的事件侦听器。
SwiftUI 通过结合视图修饰符、状态管理和手势来处理事件,以便它可以轻松跟踪事件并快速响应。与传统框架相比,SwiftUI 的声明式方法使其更具可读性,并且处理事件所需的代码更少。
SwiftUI 中的事件类型
SwiftUI 支持各种类型的事件,允许开发人员响应各种用户交互。一些常见事件如下。
按钮操作:它是最常用的操作处理程序。它允许用户通过单击或点击它来响应它。它是一个内置事件处理程序,它带有一个操作参数,该参数定义按下按钮时会发生什么。因此,只要用户按下按钮,它就会始终执行。
例如,表单有一个提交按钮,因此每当用户单击提交按钮时,字段中输入的所有数据都将发送到服务器进行存储。所以这里单击按钮是操作,将数据发送到服务器是对该操作的响应。
手势:就像按钮一样,手势也是最常用的事件处理程序。手势是一种基于触摸或动作的交互,例如点击、滑动、捏合、拖动、长按等。
它可以使用这些手势处理用户交互。例如,每当用户长按屏幕时,就会显示一个元素列表,以便用户可以从该列表中选择任何操作。所以这里长按是手势,显示列表是对该手势的响应。
基于状态的事件:在 SwiftUI 中,我们可以使用 @State 和 @Binding 创建基于状态的事件。每当发生任何变化时,它都会更新状态属性。
出现和消失事件:它借助 .onAppear 和 .onDisappear 修饰符处理视图如何在屏幕上出现或消失。
滚动事件:它使用可滚动视图响应用户交互。它使用 ScrollViewReader 来处理滚动位置。
拖放事件:此事件支持应用中的拖放交互。它允许用户从视图中拖动任何项目并将其放在应用内外的任何位置。
输入事件:此事件允许用户通过在给定的文本字段、滑块、切换按钮等中输入数据来输入数据或与用户交互。它还允许应用响应用户正在输入、选择或修改的内容。 SwiftUI 提供了各种修饰符来捕获、响应和管理输入事件。
如何在 SwiftUI 中处理事件
在 SwiftUI 中,我们可以借助点击、拖动、长按等动作和手势来处理事件。处理事件的一些常用方法如下 −
按钮点击
按钮点击事件由 Button() 方法附带的动作参数处理。此参数保存每次单击或点击按钮时将执行的操作。单个视图可以有多个按钮。
示例
以下 SwiftUI 程序用于在我们单击显示按钮时显示数据。
import SwiftUI struct ContentView: View { @State private var input: String = "" @State private var result: String = "" var body: some View { VStack { TextField("Enter Your Name", text: $input).padding() Button(action: { // 使用输入字符串更新输出字符串 result = input // 清除字段 input = "" }) { Text("Submit") .padding() .background(.brown) .foregroundStyle(.white) .cornerRadius(10) }.padding() // 显示输入的数据 if !result.isEmpty { Text("Output Data: \(result)").font(.title3) } } } } #Preview { ContentView() }
输出

手势修饰符
SwiftUII 提供各种手势处理程序,例如 TapGesture、LongPressGesture、DragGesture 等。每个手势都附加到任何视图以处理指定的交互,例如 tapGesture 处理视图上的单击或多次点击,longPressGesture 处理用户长按屏幕等。
示例
以下 SwiftUI 程序在用户点击文本时会更改文本的颜色。
import SwiftUI struct ContentView: View { @State private var myColor: Color = .red var body: some View { Text("Tap me to see the magic") .font(.title) .foregroundStyle(myColor) // 文字颜色将会改变 // 当用户点击时变为蓝色 .onTapGesture { myColor = .blue } } } #Preview { ContentView() }
输出

出现和消失事件
每当我们想要显示或消失容器或父视图或屏幕中的某个视图时,都会使用此事件。它可以借助 .onAppear 和 .onDisappear 修饰符来处理。当我们想要显示视图时,使用 .onAppear 修饰符,而每当我们清理资源或保存数据时,使用 .onDisappear 修饰符。
示例
以下 SwiftUI 程序应用出现和消失事件。
import SwiftUI struct ContentView: View { @State private var myText: String = "Hello" @State private var Visibility: Bool = true var body: some View { VStack { if Visibility { Text(myText) .font(.title) .padding() .onAppear { // 文本出现时的操作 print("Display Text") myText = "Welcome to TutorialsPoint" } .onDisappear { // 文本消失时的操作 print("Remove Text") myText = "Not Found" } } Button(action: { // 切换可见性 Visibility.toggle() }) { Text(Visibility ? "Hide Text" : "Display Text") .padding() .background(.blue) .foregroundStyle(.white) } } } } #Preview { ContentView() }
输出

@State 和 @Binding 用于交互式事件
在基于状态的事件中,我们使用 @State 和 @Binding 来记录视图状态的变化。它会根据变化自动更新状态。
示例
以下 SwiftUI 程序对滑块组件使用了状态和绑定。
import SwiftUI struct ContentView: View { // State variable @State private var value: Double = 1.0 var body: some View { VStack { Text("Adjust the slider:").font(.title) Slider(value: $value, in: 1...5).padding() // 使用绑定将滑块传递到新视图 newView(value: $value) } } } struct newView: View { // 从父视图接收的绑定变量 @Binding var value: Double var body: some View { Text("Selected Value: \(value, specifier: "%.2f")") .font(.title) } } #Preview { ContentView() }
输出

拖放事件
拖放事件用于将视图或组件从一个视图拖放到另一个位置或视图。.onDrag修饰符用于拖动数据,而.onDrop修饰符用于处理数据放置方式。
示例
以下SwiftUI程序用于将圆圈从一个位置拖放到另一个位置。
import SwiftUI struct ContentView: View { // 追踪位置 @State private var position = CGSize.zero // 跟踪拖动偏移 @State private var dragOffsetValue = CGSize.zero var body: some View { VStack { Text("Drag the circle") .font(.title) // 可拖拽圆圈 Circle() .fill(.mint) .frame(width: 100) .offset(x: position.width + dragOffsetValue.width, y: position.height + dragOffsetValue.height) .gesture( DragGesture() .onChanged { g in // 拖动过程中更新偏移值 dragOffsetValue = g.translation } .onEnded { _ in // 拖动完成后更新位置。 position.width += dragOffsetValue.width position.height += dragOffsetValue.height dragOffsetValue = .zero } ) .animation(.easeIn, value: position) } } } #Preview { ContentView() }
输出

输入事件
我们可以使用各种 UI 组件(如 TextField、Toggle、Slider 等)处理输入事件。这些 UI 组件从用户那里获取输入,并使用状态绑定和其他修饰符(如 .onSubmit、.onChange 等)来处理状态变化和用户响应。
示例
以下 SwiftUI 程序显示输入的数据。
import SwiftUI struct ContentView: View { @State private var name: String = "" var body: some View { VStack { // 用于输入 TextField("Enter your name", text: $name) .padding(10) // 显示输入的数据 Text("Entered Data: \(name)!") } .padding() } } #Preview { ContentView() }
输出
