/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
您可以List从Identifiable元素集合中创建视图。您使用什么方法来调整不符合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 函数的。
@State:SwiftUI 用 @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)