SwiftUI 教程

SwiftUI 主页 SwiftUI 概览 SwiftUI 与 UIkit

SwiftUI 环境

SwiftUI 安装和环境配置 SwiftUI 基本组件 SwiftUI 构建第一个应用程序

SwiftUI 视图

SwiftUI 视图 SwiftUI 自定义文本视图 SwiftUI 自定义图像视图 SwiftUI 堆栈

SwiftUI 绘制形状

SwiftUI 形状 SwiftUI 绘制线条 SwiftUI 绘制矩形 SwiftUI 绘制圆角矩形 SwiftUI 绘制三角形 SwiftUI 绘制圆形 SwiftUI 绘制星形 SwiftUI 绘制多边形 SwiftUI 绘制饼图 SwiftUI 使用内置形状

SwiftUI 文本

SwiftUI 文本视图 SwiftUI 文本输入和输出

SwiftUI 颜色

SwiftUI 颜色 SwiftUI 颜色选择器 SwiftUI 渐变 SwiftUI 调整颜色

SwiftUI 效果

SwiftUI 效果 SwiftUI 混合效果 SwiftUI BLur 效果 SwiftUI 阴影效果 SwiftUI 悬停效果

SwiftUI 动画

SwiftUI 动画 SwiftUI 创建动画 SwiftUI 创建显式动画 SwiftUI 多个动画 SwiftUI 过渡 SwiftUI 不对称过渡 SwiftUI 自定义过渡

SwiftUI 图像

SwiftUI 图像 SwiftUI 图像作为背景 SwiftUI 旋转图像 SwiftUI 媒体

SwiftUI 视图布局

SwiftUI 视图布局 SwiftUI 视图大小 SwiftUI 视图间距 SwiftUI 视图填充

SwiftUI UI 控件

SwiftUI UI 控件 SwiftUI 按钮 SwiftUI 复选框 SwiftUI 菜单栏 SwiftUI 工具栏 SwiftUI 搜索栏 SwiftUI 文本字段 SwiftUI 滑块 SwiftUI 切换 SwiftUI 选择器 SwiftUI 菜单

SwiftUI 列表 &表格

SwiftUI 列表 SwiftUI 静态列表 SwiftUI 动态列表 SwiftUI 自定义列表 SwiftUI 表格

SwiftUI 表单

SwiftUI 表单 SwiftUI 在部分中拆分表单

SwiftUI 事件处理

SwiftUI 事件处理 SwiftUI 手势 SwiftUI 剪贴板 SwiftUI 拖放 SwiftUI 焦点 SwiftUI 警报

SwiftUI 杂项

SwiftUI 容器 SwiftUI 导航 SwiftUI 通知 SwiftUI 跨平台 UI SwiftUI 数据 SwiftUI 可访问性

SwiftUI 框架集成

SwiftUI 框架集成 SwiftUI 与 UIKit 交互 SwiftUI 创建 macOS 应用

SwiftUI 有用资源

SwiftUI 有用资源 SwiftUI 讨论


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()
}

输出

事件处理