Swift UI-在欧洲驰gall

图片


22:35。 欢欣鼓舞


查看了WWDC 2019关键说明。 预期的声明性UI确实实现了,这对于iOS开发界来说确实是一个普遍事件。 我想:“我们需要写一篇有关此的文章。”全世界有成千上万的iOS开发人员正在兴高采烈。


05:30 讲解


Swift UI-Apple开发的用Swift编写的新框架,旨在用代码声明性地描述UI。

我注意到,每年在文档方面,Yabloko都在变得越来越酷。 这次,在Swift UI下,他们看到了一些完整的教程,其中包含逐步添加和在结果上交互式显示结果的视图,最后,他们仔细地添加了控制问题以合并结果。 好吧,只是一个童话! 也有到示例项目的链接。



真好!


我不会用俄语复述该教程,因为它采用的是漂亮的形式,最好在原始资料中注明。 我将通过Swift UI以及其中的一些内容描述我对整个故事的印象和观察。


上午07:00 安装方式


新的Xcode具有新的代码编辑模式-编辑器和画布。



我没有立即看到画布-为此,不足以下载Xcode 11.0,您还需要将Makos更新到10.15。 没有它,Xcode就可以工作,但没有画布的乐趣,甚至可能没有其他乐趣。


我很高兴当您选择代码时,画布中的相应元素也会突出显示。


例如,新轴已启动。 崩溃了吗? 好吧,是的。 背光灯会掉光吗? 不,当然-在Xcode中从未发生过这种情况;)但是画布可以工作,并且如果这不是具有复杂单元格的表,则视图更改会立即反映出来。



09:22。 新项目


创建新项目时,“使用Swift UI”选项现在可用,并且使用适当的配置创建了项目。



新的SceneDelegate文件SceneDelegate ,在其中创建了窗口及其根视图。 但是在AppDelegate ,没有关于他的任何消息。 但是,有一个新方法可以创建UISceneConfiguration


 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // Called when a new scene session is being created. // Use this method to select a configuration to create the new scene with. return UISceneConfiguration(name: «Default Configuration», sessionRole: connectingSceneSession.role) } 

好吧, Default Configuration本身在Info.plist并在SceneDelegate指示SceneDelegate 。 一切都准备就绪。



但是回到SceneDelegate启动在其中进行。


 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). // Use a UIHostingController as window root view controller let window = UIWindow(frame: UIScreen.main.bounds) window.rootViewController = UIHostingController(rootView: ContentView()) self.window = window window.makeKeyAndVisible() } 

UIHostingController是常规的generic UIViewController ,在新的View协议下可以具有任何类型的内容


 open class UIHostingController<Content> : UIViewController where Content : View { /// } 

View协议是淫秽的:


 public protocol View : _View { associatedtype Body : View var body: Self.Body { get } } 

也就是说,他只需要实现body
但是诀窍在于,在此View协议上编写了大量扩展,例如用于悬挂手势,跟踪屏幕上视图的出现和消失,缩进,框架等等。 您可以在Dock中查看所有这些内容。 Apple开发人员文档 。 这意味着您开箱即用(根据View协议)创建的任何视图都将获得各种超级功能!


让我们ContentView.swiftContentView.swift


 struct ContentView : View { var body: some View { Text(«Hello World») } } 

很简单:我们从已经实现的视图和控件|视图创建一个视图 Apple开发人员文档 。 可以使用各种容器使其变得更加复杂 Apple Developer Documentation和我们已经创建的视图。


使用Swift UI进行布局是一个单独的故事,有关它将编写更多材料,Apple也有一个值得学习的教程。 我不会再赘述了。 让我们回到ContentView.swift的第二部分,有这样的代码:


 #if DEBUG struct ContentView_Previews : PreviewProvider { static var previews: some View { ContentView() } } #endif 

从名称中可以明显看出,是他负责画布中显示的内容-并且他previews显示previews ,在我们的示例中为ContentView()


让我们尝试用原始表创建一个屏幕:


 struct ContentView : View { var birds: [Birds] = [] var body: some View { List(birds) { bird in Text(verbatim: bird.name) } } } 

仅此而已。 做完了 简单,简洁,优雅。 这就是声明性UI的全部魅力!


可以看出, List是一个隐藏的表。 但不是UITableView,而是一些UpdateCoalesingTableView。



而且很明显,没有自动布局。 没有约束,一切都在框架上,这意味着不存在具有线性方程和大量计算的复杂系统。 但是,另一方面,布局是自适应的,并且框架是以某种方式计算的-让我们在以后的WWDC会话中确切地了解如何。


Swift UI-是UIKit的包装吗? 似乎同时是,不是。


Joe Groff发表了以下推文:


“某些实体是UI / NS视图的包装器,但是它们执行此操作以及包装哪种视图这一事实可以改变。”

原件:
有些东西会包装UI / NS视图,但是它们是否会包装以及它们包装的视图类型可能会发生变化。 最好将其视为独特的事物。


我注意到的更多:



上午11点 合计


these,所有这些魅力


 @available (iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) 

也就是说,切换到它们就是放弃旧的轴,这太激进了,用户不必担心。


我确信该机制仍然很粗糙,还会有更多更改,并且会弹出很多错误,这是自然的。 但是在一两年之内就可以将其引入产品中。


Swift UI是人们自称为iOS开发人员的世界的一次直接革命,这条新路虽然不理想,却开了,这很酷。


同时,没有什么可以阻止您在宠物项目中使用它,亲身体验并获得美感:)

Source: https://habr.com/ru/post/zh-CN454750/


All Articles