swiftUI-官方文檔(to be continued)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章