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

输出

事件处理