/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)