swiftUI-官方文档(to be continued)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/denggun12345/article/details/96489862

/Users/yangyangzi/Desktop/YangZi2/swift/swiftUI-官方文档-学完js再 回来学/SwiftUI.rtf (公司电脑)

学习教程:https://developer.apple.com/tutorials/swiftui/creating-and-combining-views

一、创建和组合视图

6.26:需要用Catalina  macOS 10.15 beta 10.15的系统才能看到swiftUI的cavans:https://www.v2ex.com/t/573019

6.27:

1节:创建一个新项目并探索画布

安装好Mac系统10.15后,cavas依旧不能显示,报错failed to build ContentView.swift,点击Diagnostics,具体问题如下:

invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

----------------------------------------

failedToCodeSign: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

/Users/yangyangzi/Library/Developer/Xcode/DerivedData/CreatingAndCombiningViews-ftgpsvdswgizgqgyfzdaoirbhbey/Build/Intermediates.noindex/Previews/Landmarks/Intermediates.noindex/CreatingAndCombiningViews.build/Debug-iphonesimulator/Landmarks.build/Objects-normal/x86_64/ContentView.2.preview-thunk.dylib: the codesign_allocate helper tool cannot be found or used

尝试一:

安装命令行开发工具Xcode  command line tools

https://blog.csdn.net/CHENYUFENG1991/article/details/47007979

Command line tools(Xcode命令行工具)作用:可以写c语言程序;建立文件夹;建项目等

此方法有效:安装好xcode命令行工具,再点击画布的resume,画布就能正常展示了

https://cloud.tencent.com/developer/ask/222081 虽然没直接帮我解决问题,此回答还是略有启发的

6.28

第2节:自定义文本视图

源编辑器;画布;检查器

第3节:使用堆栈组合视图

VStack

HStack

嵌入Stack;向此Stack中拖控件;Stack内视图的对齐;此stack中的某视图再嵌入个StackTwo;向此StackTwo中拖控件;StackTwo的两个控件添加Spacer;用padding()填充留边

(这个Stack的操作特别像安卓的各种layout;swiftUI特别像安卓的xml文件)

Xcode的结构化编辑支持,embed in stack

第4节:创建自定义图像视图

Image("home_usercenter")

形状:

.clipShape(Circle())

添加叠加层即边框:

.overlay(Circle().stroke(Color.gray, lineWidth: 4))

添加阴影:

.shadow(radius: 10)

第5节:一起使用UIKit和SwiftUI视图

实时预览

第6节:撰写详细信息视图

二、建立列表和导航

第1节:了解样本数据

第2节:创建行视图

7.1

每次新创建的SwiftUI文件,都默认有两个结构体

第3节:自定义行预览

第4节:创建地标列表

第5节:使列表动态化

1、identified(by:)使用唯一标识每个元素的属性的键路径调用方法,或者使数据类型符合Identifiable协议。

2、Identifiable协议

第6节:在列表和详细信息之间设置导航

List{ }

第7节:将数据传递到子视图

第8节:动态生成预览 (同时查看不同设备的画布;您可以尝试使用不同的设备来比较视图的渲染,所有这些都来自画布)

.previewDevice(PreviewDevice(rawValue:

struct LandmarkList_Previews : PreviewProvider {

    static var previews: some View {

        LandmarkList().previewDevice(PreviewDevice(rawValue: "iPhone XS"))

    }

}

forEach

//        ForEach以与列表相同的方式对集合进行操作,这意味着您可以在任何可以使用子视图的位置使用它,例如在堆栈,列表,组等中。当数据元素是简单的值类型(如您在此处使用的字符串)时,您可以将其\.self用作标识符的关键路径

        ForEach(["iPhone SE", "iPhone XS Max"].identified(by: \.self)){

            deviceName in

        LandmarkList().previewDevice(PreviewDevice(rawValue: deviceName))

        }

Group:您可以使用组和堆栈来组织视图和其他内容,但不能直接从没有此处列出的其他类型的集合中使用。

ForEach:将实例放在一个或其他容器类型中以创建动态列表。ForEachList

您可以ListIdentifiable元素集合中创建视图。您使用什么方法来调整不符合Identifiable协议的元素集合?

func identified(by:)  即将密钥路径传递给集合的元素的唯一标识属性到该identified(by:)方法。

NavigationView:列表及其子项设置导航层次结构,但是您需要使用不同的类型来使行充当导航到另一个视图的按钮。

创建List可导航的行以导航到另一个视图:在声明时,提供目标视图和行的内容。NavigationButton

三、处理用户输入

forEach

第1节:标记用户喜欢的地标

Image(systemName: "star.fill").imageScale(.medium)

第2节:过滤列表视图

@State:状态是一个值或一组值,它们可以随时间变化,并且会影响视图的行为,内容或布局,@State属性的属性将状态添加到视图。

SwiftUI 用 @State 来维护状态,状态改变后,会自动更新 UI。类似的语法还有 @Binding,@@Environment 等。

@State 修饰的状态发生改变,SwiftUI 会再次调用 body, 处理界面的更新。这些具体实现都可以隐藏到 State的 value 读写当中

第3节:添加控件以切换状态

swiftUI的DSL语法:https://mp.weixin.qq.com/s/-LhgGUJs4PppOJ-0-9VRPA

1、省略 return:单语句才会省略

2、属性(Attribute)

Attribute 是指 @ 字符开头的,类似 @available 这种语法;

Swift 的 Attribute 语法可以放到类型定义或者函数定义的前面,是对类型和函数的一种标记。

下面大致描述 Attribute 的原理,具体的实现细节可能会有出入。

编译 Swift 源代码时,在解析阶段(Prase), 会生成一个抽象语法树(AST,Abstract Syntax Tree)。语法树生成时,所有的 Attribute 统一处理,生成 Attribute 节点。之后在语义分析阶段(semantic analysis),会有可能触发 Attribute 节点,使其对语法树本身产生影响。

不同的 Attribute 对语法树可以有不同的影响。比如 @available 会根据系统对语法树的函数调用进行可行性检查,不修改语法树本身。而 @dynamicMemberLookup,@dynamicCallable 进行检查后,可能会直接修改语法树本身,从而转调某些根据规则命名好的类或者函数。

Attribute 是种元编程(Metaprogramming)手段,Attribute 语法会被编译成语法树节点,而 Attribute 又可以反过来修改语法树本身。在类定义或函数定义前添加不同的 Attribute,可以不同的方式修改语法树,从而实现某些常规方式难以实现的语法。其实很好理解,既然都可以修改语法树了,自然就可以通过 Attribute 实现神奇的语法。

假如修改 Swift 的源码,可以根据不同的场合,很容易添加自定义 Attribute。比如 @UIApplicationMain 就是一个自定义 Attribute 扩展,为语法树添加了入口 main 函数。因而用 swift 写 iOS App, 是不用自己写 main 函数的。

@StateSwiftUI 用 @State 来维护状态,状态改变后,会自动更新 UI。类似的语法还有 @Binding,@Environment 等。

这个语法特性看起来很神奇,叫 Property Delegates[4]。

State 其实只是个自定义类,用 @propertyDelegate 修饰,将 zoomed 的读写转到 State 实现了。其余的 @Binding,@Environment 一样的道理,将 Property 读写转到 Binding 和 Environment 类实现了

@propertyDelegate

假如要保存多个值,就会重复 多次。为了避免重复代码,可以将相同的行为指派某个代理对象去做,为此引入 Property Delegates。

@dynamicMemberLookup 的实现流程

SIMPLE_DECL_ATTR(dynamicMemberLookup, DynamicMemberLookup,
  OnNominalType,
  9)

猜你喜欢

转载自blog.csdn.net/denggun12345/article/details/96489862