WWDC2020講稿系列之App Essentials in SwiftUI

開場白

開場白

技術交流
QQ:3365059189
SwiftUI技術交流QQ羣:518696470

您好,歡迎來到WWDC。歡迎使用SwiftUI中的App Essentials。我叫Matt Ricketson,我從事SwiftUI。稍後,我的同事Jeff將加入我的行列。去年,我們推出了SwiftUI,這是一種功能強大的新方法,可以在所有Apple平臺上構建出色的用戶界面。


SwiftUI提供了一組API

我們使用視圖構建用戶界面,SwiftUI提供了一組API,用於修改視圖並將它們組合在一起。今年,我們將通過用於聲明場景和應用程序的新API擴展框架,這是對使用SwiftUI可以構建的內容的巨大擴展。最重要的是,您現在僅可以使用SwiftUI構建整個應用程序。在本節中,我們將介紹這些新的API,並說明視圖,場景和應用程序如何協同工作。

接下來,我們將深入介紹SwiftUI的場景架構,並展示如何自定義應用程序中的場景。最後,我們將簡要概述可用於自定義應用程序的各種API,以及在何處可以瞭解更多信息。

從View開始

現在,讓我們從討論視圖開始。如果您以前使用過SwiftUI,那麼您已經熟悉了。


視圖很重要

萬物皆是View

視圖很重要,因爲每個視圖都定義了一部分用戶界面。當您查看應用程序時,所看到的都是視圖。單個圖像和一段文字就是視圖。裝有它們的容器也是視圖。實際上,您在屏幕上看到的每個像素都以某種方式由視圖定義。但並非所有視圖都屬於同一應用程序,因爲應用程序無法完全控制整個屏幕。而是由平臺控制如何呈現應用程序,以顯示不同區域中的應用程序片段。

在SwiftUI中,我們將這些不同的區域稱爲場景。窗口是在屏幕上顯示場景內容的最常見方式。某些平臺(例如iPadOS)可以並排顯示多個窗口。

排顯示多個窗口

其他平臺(例如iOS,watchOS和tvOS)更喜歡爲每個應用程序僅顯示一個全屏窗口。


僅顯示一個全屏窗口

macOS是場景內容如何以不同方式出現的另一個很好的例子。在這種情況下,我們看到了一組相關窗口,其中每個窗口都是不同場景內容的體現。


一組相關窗口

macOS還允許您將相關窗口收集到單個選項卡式窗口中。在這種情況下,我們的場景將顯示爲單獨的選項卡。此共享窗口也由其自己的場景表示,充當與每個選項卡關聯的子場景的容器。這些場景集合構成了應用程序的全部內容。


所有權層次結構

應用程序,場景和視圖共同構成了統一的所有權層次結構。正如我們前面提到的,視圖是呈現您在屏幕上看到的所有內容的基本構建塊,並且可以組合在一起以形成更復雜的用戶界面。視圖構成場景的內容,從而使平臺可以獨立顯示它們。像視圖一樣,這些場景也可以組合在一起以形成更復雜的場景,就像在我們之前看到的選項卡式窗口示例中一樣。

最後,所有這些場景構成了應用程序的內容。現在我們瞭解了應用程序,場景和視圖是如何協同工作的,讓我們看看它在SwiftUI代碼中如何發揮作用。

在這裏,我們看到了我在SwiftUI中編寫的一個基本應用程序,可以幫助我跟蹤在讀書俱樂部閱讀的書籍。如您所見,SwiftUI中的應用程序具有簡潔的聲明。意味着像這樣的基本應用程序只能容納少數幾行代碼。沒有額外的樣板,您可以立即專注於應用程序特有的代碼。


沒有額外的樣板

在這種情況下,我們使用稱爲ReadingListViewer的視圖定義了應用程序的實際界面。 ReadingListViewer是我單獨構建的自定義視圖,允許我瀏覽閱讀列表。

我們的ReadingListViewer包含在稱爲WindowGroup的場景中。 WindowGroup場景管理我們的ReadingListViewer將渲染到的窗口。它還可以在支持這些功能的平臺上創建其他窗口或同一窗口內的新選項卡。

Jeff將在稍後的演講中詳細解釋WindowGroup的工作原理。我們的WindowGroup場景包含在由符合應用協議的自定義結構表示的應用中。您會注意到,代碼的結構與我們之前看到的所有權層次結構匹配。該應用程序包含場景,而場景包含視圖。

您可能還會注意到,我們的應用程序聲明看起來類似於自定義視圖聲明。例如,視圖和應用程序都能夠聲明數據依賴性。

StateObject 與 ObservedObject

在這裏,我們的ReadingListViewer觀察一個ReadingListStore對象。我們的應用程序還依賴於ReadingListStore對象,但使用StateObject屬性包裝器將自己聲明爲該對象的所有者,這是SwiftUI今年的一項新功能。視圖和應用程序都還聲明瞭定義其用戶界面內容的主體屬性。

前面我們討論了視圖是如何由其他視圖組成的,這就是視圖主體返回視圖的原因。但是,應用是使用場景構建的,因此它的body屬性會返回一個場景。

最後,您可能會注意到@main屬性裝飾了我們的應用程序。這是Swift 5.3中的新屬性,該屬性允許類型充當程序執行的入口點。

通常,Swift程序需要main.swift文件才能執行。使用@main屬性,我們可以將該職責委託給我們的delegate,該delegate在啓動時自動執行所有必要的設置,以使我們的應用程序顯示在屏幕上。

現在,我們已經審查了代碼,讓我們退後一步。我們在這裏看到的是SwiftUI中一個基本應用程序的完整聲明,僅適合少數幾行代碼。但是不要讓這個欺騙你。這個簡單的聲明中包含了大量的自動,智能行爲。爲了真正瞭解此應用程序的工作原理,我們需要更多地討論管理用戶界面的WindowGroup場景。爲此,我將把事情交給傑夫。

傑夫介紹WindowGroup原理

謝謝馬特。嗨,大家好。首先,我想通過簡短的演示向您展示Matt在實踐中概述的一些概念,然後再討論WindowGroup的一些優點。我是一個非常狂熱的讀者,所以我一直在開發一個小應用程序,以跟蹤我的進度以及我目前正在閱讀的所有書籍。

iPadOS演示

如您所見,我的應用程序使用我指定爲內容的視圖在iPadOS上的初始窗口中啓動。看來我在很多書中,所以讓我們打開一些新窗口,以便檢查進度。如果我打開應用程序Expose,則可以在這裏輕鬆創建一個新書,然後導航到另一本書。 WindowGroup在iPadOS上自動爲我的應用程序提供此功能。您會注意到,我的每個窗口在界面中都反映了不同的狀態。所選書籍在每一本書中都是不同的,並且對其進行更改不會影響其他書籍。


共享模型

這是SwiftUI中場景的關鍵方面。應用可以爲要使用的每個場景提供共享模型,但是這些場景中視圖的狀態將是獨立的。我還要指出應用切換器中的某些內容。我的每個窗口都顯示我的應用程序名稱以及所選書籍的名稱。

新修飾符Navigation Title

這是通過今年我們引入的新視圖修飾符完成的-導航標題,在iOS上可用於在導航欄和應用切換器中填充標題。這是視圖修改器的一個示例,它可能會影響其父場景的狀態。在Mac上,通過在應用程序中使用WindowGroup來支持多個窗口是很常見的,SwiftUI將在文件菜單中提供一個菜單項,該菜單項支持創建新的可見實例。

也可以通過標準命令Command+ N鍵盤快捷鍵來調用此項目。


Command+ N鍵盤快捷鍵

您會注意到導航標題如何在macOS上應用。書籍標題顯示在Windows標題欄區域中。它還將在Windows菜單中使用。在這裏提供良好的標題對用戶很重要。

由於除了爲他們提供與其交互的內容的更多上下文之外,它還幫助他們從打開的窗口列表中選擇所需的窗口。

窗口合併到單個選項卡式界面

除了支持多個Windows,macOS還支持將其窗口分組在一起。通過窗口菜單,我可以將打開的窗口合併到單個選項卡式界面中。

窗口合併到單個選項卡式界面

每個選項卡由一個單獨的場景表示。同樣,我無需爲此功能編寫任何代碼SwiftUI自動提供了此功能。

既然您已經瞭解了在應用程序中使用WindowGroup場景的一些實際含義,那麼讓我們進一步瞭解一些細節。回顧一下我剛纔向您展示的內容,WindowGroup是一個場景,可讓您表達應用程序的主要界面。您提供給它的視圖將用作該接口的定義。這可以按預期方式在我們所有平臺上運行。例如,在iOS和watchOS上,您的視圖將顯示在一個佔據設備整個屏幕的窗口中。

在macOS上,將根據視圖的定義調整窗口大小。場景的生命週期由運行它們的平臺管理。


截屏2020-06-26 下午3.00.11.png

以macOS爲例,當平臺需要爲您的應用程序創建一個窗口時,WindowGroup將實例化一個新的子場景,默認情況下,該子場景將在窗口中顯示其內容。在支持多個Windows的平臺(例如macOS和iPadOS)上,WindowGroup可以實例化多個子代。這可能是由於響應用戶操作(例如單擊菜單項或調用多任務手勢)而發生的。每個場景共享其用戶界面的定義。構成此定義的視圖均具有各自獨立的狀態。這意味着在一個窗口中更改視圖狀態不會影響另一個窗口的狀態。使用此功能,您可以提供用於界面的模板,同時讓用戶通過您提供的狀態自定義該界面。

具有各自獨立的狀態

SceneStorage

SceneStorage

由於平臺負責場景的生命週期,因此今年我們引入了新的屬性包裝器,以幫助您管理視圖狀態的恢復。SceneStorage屬性包裝器可用於保留視圖狀態。

它採用唯一的密鑰來標識要存儲的狀態。然後,SwiftUI將在適當的時間自動保存和還原此狀態。現在,我向您展示了更多有關場景(尤其是WindowGroup)如何工作的信息。我想將事情交還給Matt,他將爲您提供更多有關如何進一步自定義應用程序的信息。

自定義應用程序的信息

謝謝傑夫。在結束之前,我想向您展示今年其他一些與應用程序相關的新功能。我們之前看到的讀書俱樂部應用程序是由共享數據模型支持的數據驅動應用程序。但是,還有其他種類的應用程序,例如基於文檔的應用程序,就像我們在這裏看到的ShapeEditApp一樣。今年新增的是文檔組的場景類型,它可以自動管理基於文檔的場景的打開,編輯和保存。

要了解更多信息,您應該查看今年的“在SwiftUI中構建基於文檔的應用程序”演講。現在回到我們的讀書俱樂部示例,macOS應用程序的一個共同功能是首選項窗口。今年,我們將展示macOS上可用的新的Settings場景類型,它會自動設置標準首選項窗口。設置場景將自動在應用程序菜單中設置首選項命令,併爲窗口提供正確的樣式處理。

新命令修飾符將自定義命令添加到場景中
BookCommands

說到菜單命令,SwiftUI還提供了一個API,供您使用新命令修飾符將自定義命令添加到場景中。 BookCommands是我定義的自定義類型。

讓我們快速看一下。使用與視圖,場景和應用程序中相同的聲明式狀態驅動編程模型,命令API既強大又靈活。您可以將命令封裝爲自定義類型,並基於用戶關注目標操作,類似於AppKit或UIKit中的響應者鏈,並可以使用常規視圖自行構建命令。請查閱我們的參考文檔,以獲取有關使用命令的更多信息。這只是對SwiftUI今年可用的與新應用程序相關的API的一瞥。

下面知識

下面的知識

我還建議您查看其他SwiftUI講座,這將幫助您構建應用程序的內容。 “ SwiftUI中的Data Essentials”將使您掌握如何在應用程序場景和視圖之間正確傳遞數據的知識。在“ Swift的新增功能”中,我們將向您展示該語言的最新改進,可以改進您的所有SwiftUI代碼。

我們非常期待看到您構建的所有出色的SwiftUI應用程序,希望您在論壇上與我們分享您的創作。我們喜歡您的所有反饋意見,迫不及待想看看您接下來要做什麼。

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