SwiftUI 学习第一天

214 阅读4分钟

Swift UI

在每个平台上声明应用程序的用户界面和行为。

概述

SwiftUI提供视图、控件和布局结构,用于声明应用程序的用户界面。该框架提供了事件处理程序,用于向您的应用程序交付点击、手势和其他类型的输入,以及管理从应用程序模型到用户将看到和交互的视图和控制的数据流的工具。

使用App协议定义您的应用程序结构,并用包含构成应用程序用户界面的视图的场景填充它。创建符合View协议的自定义视图,并使用SwiftUI视图编写它们,以使用stacks、lists等显示文本、图像和自定义形状。对内置视图和您自己的视图应用强大的修饰符,以自定义其渲染和交互性。在多个平台上的应用程序之间共享代码,其视图和控制可以适应其上下文和演示文稿。

image.png

您可以将SwiftUI视图与UIKit、AppKit和WatchKit框架中的对象集成,以进一步利用平台特定功能。您还可以在SwiftUI中自定义辅助功能支持,并根据不同的语言、国家或地区或文化区域本地化应用程序的界面。

Essentials

Swift UI简介

SwiftUI是声明任何苹果平台用户界面的现代方式。创建美丽、动态的应用程序的速度比以往任何时候都快。 #创建和组合视图

参考github example工程学习 Combine 和 SwiftUI 的结合

SwiftUI-Combine-Example

链接

工程结构

image.png

User

image.png

SearchUserViewModel

image.png

SearchuserView

image.png

SearchUserRow

image.png

SearchUserBar

image.png

模拟器运行

image.png

参考地址:# SwiftUI - Data Binding注解

Binding

@Binding是对属性的修饰,它做的事情是将值语义的属性“转换”为引用语义。对被声明为@Binding的属性进行赋值,改变的将不是属性本身,而是它的引用,这个改变将被向外传递。

Declaration

@Binding var isPlaying: Bool

@Binding var text: String

使用绑定在存储数据的属性和显示和更改数据的视图之间创建双向连接。绑定将属性连接到存储在其他地方的真相来源,而不是直接存储数据。例如,在播放和暂停之间切换的按钮可以使用“绑定”属性包装器创建对其父视图属性的绑定。

image.png

State

一种属性包装器类型,可以读取和写入SwiftUI管理的值。

父视图声明属性以保持播放状态,使用State属性包装器指示此属性是值的真相来源。

官方建议将@State 修饰的值设置为private,它应仅属于当前视图

用@State标识的值,便将该值控制权交给了SwiftUI,对这个属性进行赋值的操作将会触发 View 的刷新,它的 body会被再次调用,底层渲染引擎会找出界面上与这个值相关的改变部分,并进行刷新。

Declaration

@State private var isPlaying: Bool = false


SwiftUI管理您声明为状态的任何属性的存储。当状态值发生变化时,视图使其外观无效,并重新计算正文。使用状态作为给定视图的单一真相来源。

State实例不是值本身;它是读取和写入值的一种手段。要访问状态的基础值,请使用其变量名称,该变量名称返回wrappedValue属性值。

您只应从视图主体内部或其调用的方法访问状态属性。出于这个原因,将您的状态属性声明为私有属性,以防止视图的客户端访问它们。从任何线程中更改状态属性是安全的。

要将状态属性传递给视图层次结构中的另一个视图,请使用带有“”前缀运算符的变量名称。这将从其[projectedValue]()属性中检索状态属性的绑定。例如,在以下代码示例中,“PlayerView”使用“”前缀运算符的变量名称。这将从其[`projectedValue`]()属性中检索状态属性的绑定。例如,在以下代码示例中,“PlayerView”使用“isPlaying”将其状态属性“isPlaying”传递给“PlayButton”:

image.png

Observed​Object

一种属性包装器类型,订阅可观察对象,并在可观察对象更改时使视图无效。 @ObservedObject标示了一个来自于外部的state,

Declaration

@ObservedObject var viewModel: SearchUserViewModel

SearchUserViewModel需要实现ObservableObject协议。在其内部定义的的users标示为@Published后,使用方就可以像内部的@State一样使用它


final class SearchUserViewModel: ObservableObject {

    @Published var name = "ra1028"

    @Published private(set) var users = [User]()


Published

发布带有属性标记的属性的类型。

Declaration

@Published  var name = "ra1028"

@Published  private(set) var users = [User]()
    
    

使用“@Published”属性发布属性将创建此类发布者。您可以使用“$”运算符访问发布者,如下所示:

image.png

Environment​Object

父视图或祖先视图提供的可观察对象的属性包装器类型。

每当可观察对象发生变化时,环境对象都会使当前视图无效。如果您将属性声明为环境对象,请务必通过调用其environmentObject(_:)修饰符在祖先视图上设置相应的模型对象。

EnvironmentObject就是整个App共享的的一个state,app里的所有View都可以获取到里面的信息。