swiftui 跳转_【干货】SwiftUI 入门实战(上)

7bc9cdfecad55e5d72d368fdda4330a0.png

原创: 彭权华

首发:知晓云 - 小程序开发快人一步

SwiftUI 是苹果最新推出的 UI 开发工具,其具有以下特点:采用声明式语法,易于阅读、代码更少;跨所有苹果平台,共用一套 API;自动支持动态类型、暗黑模式、本地化等。采用 SwiftUI 将大大提高 UI 界面开发效率。
大家好,我是小彭。苹果近期推出了一个全新的 SwiftUI 框架,可以极大地提高 iOS 上 UI 界面的开发效率。今天小彭就用 SwiftUI 来实现一个新闻资讯 app,看看能有多快。


【关注「知晓云」公众号,回复关键字「SwiftUI」获取完整代码】
受篇幅所限,我们将通过上下两篇文章为大家介绍如何实现一个完整的新闻资讯 app,本篇主要内容有:

  • SwiftUI 的基础知识:预览、View 协议、修饰器、@State 特性等。
  • 使用 NavigationView、NavigationLink、List、Text、Image 等基本视图和 HStack、VStack 常用的布局方式创建资讯列表页、资讯详情页并显示从 daliy.plist 文件读取的新闻信息。

1 开始

在 Xcode 11,创建一个新项目,选择 iOS->Single View APP,命名为 Daily,并选中 Use SwiftUI。

cfde3c539e80b4aba577927a3eb2d6b6.png

ScenDelegate
SwiftUI 项目新增了一个 ScenDelegate.swift 文件,AppDelegate 和 ScenDelegate 共同用于管理 app 的生命周期。ScenDelegate 的 scene(_:willConnectTo:options:) 进行 UI 配置:

c99399bd273365579e6e57d6710fb9a8.png

预览(Preview)
打开 ContentView.swift 文件,右上角有一个 Resume 按钮,如果没有看见 Resume 按钮,选择 Editor > Canvas。

ed5c7c103c6c92730650d39a2d24d38c.png


点击 Resume 对 ContentView 视图进行预览

295903beb0b5a37e4a45e39f048aedc1.png


要支持预览视图,需要实现 PreviewProvider 协议,并在协议属性内返回该视图实例,比如为 ContentView 提供预览:

924635765b866377e5fecc5c690b1ead.png


以往写一个页面,如果这个页面藏得很深,那么你运行后进入到这个页面需要耗费很长时间。现在不需要运行,通过预览可以马上看到页面效果,节省了页面开发时间。
注意:必须 macOS 10.15 以上系统才支持预览功能!View 协议和修饰器
ContentView 实现了 View 协议。所有视图都需要实现 View 协议,在协议属性 body 内提供视图内容和布局。

3e14cd5d26398372a442c5c109b472c9.png


Text 也是一个 View。注意:自定义视图的 body 最多创建 10 个子视图。
通过修饰器(modifier)来配置视图,比如将 Text 的文字设置为红色,字体为 system,大小为 16,那么可以通过 foregroundColor、font 修饰器来配置:

c2fb7fd98283b01abd27ab9d1fe77519.png


每个修饰器都会返回新的视图 View,通过多个修饰器形成一个修饰链来完成对适配的配置。需要注意的是,修饰器的顺序不同可能产生不一样的结果。

2 数据准备

每一条新闻资讯包含标题、作者、发布日期、详细内容、图片等信息。创建一个 swift 文件,命名为 News.swift。在该文件内创建一个新闻模型 News:

b77f0caa47085c71ce5c929de8f4294b.png


为了简单起见,预定义了 2 条新闻资讯信息。fetchDaliy() 方法获取新闻信息并返回 News 数组:

378ffce4b98a8e44dfa07762ca3e7d2f.png

3 UI 构建

App 的主要内容有:新闻列表页、新闻详情页。我们将所有新闻资讯展示在一个列表上,每一行代表一条新闻,点击一行进入到资讯详情页。相应地,需要三个页面:列表页、列表项、详情页。新建三个 SwiftUI 文件,分别命名为 NewsListView.swift、NewsListRow.swift、NewsDetailView.swift 。NewListView 表示列表页,NewsListRow 表示列表项,NewsDetailView 表示详情页。页面导航
在列表页点击一条新闻,将跳转到详情页,同时详情页也能够返回到列表页。在 SwiftUI 中,使用 NavigationView 和 NavigationLink 来实现页面之间的导航跳转。将列表页 NewsListView 嵌入到 NavigationView 中,SwiftUI 会在 NewsListView 顶部增加一个导航栏 NavigationBar。打开 ContentView.swift 文件,增加以下代码:

d725f9ebe47f4c5b10b9c109d4e6240a.png


navigationViewStyle 指定导航类型,若未指定,在 iPhone 和 iPad 默认的导航类型不一样。新闻列表页
在 NewsListView 中,我们需要获取所有新闻资讯数据,并展示在一个列表上。

e1f2e2fde4d6f4ad4d53fd2256b74913.png


通过 List 声明一个列表,并指定数据源和每一行的内容。

c98c8e4935e0f2b794a053e0050dfba3.png


NavigationLink 通过指定目标页面,实现页面之间的跳转。
另外需要注意的是,List 的初始化方法指定了数据源,数据源的元素需要实现 Identifiable,因此我们在 News 类型实现了 Identifiable。新闻列表项
每一个列表项显示一条新闻,内容包含图片、标题、发布日期。布局如下图:

366d5ca8af7ff7f249f86eabb8fda164.png


在 SwiftUI 中,使用 HStack 和 VStack 来组合不同的使用的视图。HStack 表示横向关系,VStack 表示纵向关系。标题和日期是纵向关系,而标题和日期组合起来和图片是横向关系。NewListRow 的实现如下面代码:

0d409951e2a2bd37941ec961fc371ba3.png


我们需要实现 WebImageView 获取网络图片并显示,图片未下载时显示一个占位图片,当图片下载后将显示该网络图片:

3f30cdd42853499d4b463399aceee8ea.png


Image 是 SwiftUI 的图片控件,uiImage 为 nil 时,Image 视图显示 placeholderImage 占位图。当 WebImageView 出现时(onAppear),将会根据 imageUrl 下载图片,下载完成后将 image 赋值给 uiImage,此时 SwiftUI 会自动更新 Image 的图片。Image 能够自动更新,是因为将 uiImage 声明了 @State 特性。将 View 的存储属性声明为 @State 后,每当该属性的值发生变化时,SwiftUI 都会重新绘制 body 的内容。新闻详情页
在新闻详情页,我们需要显示标题、作者、发布日期、详细内容。布局如图:

0407323310e87adff849cc06f2c30777.png


代码如下所示

354a56c47e51e75a69098299c324b672.png


通过 navigationBarTitle 来设置详情的导航标题,以及展示模式。padding 设置视图间的间隔。

4 小结

以上虽然解决了 UI 构建的问题,但实际应用中,数据都是动态变化的,所以我们需要与后端服务器进行交互。下一篇文章小彭将继续为大家介绍 SwiftUI 的 ObservableObject、@ObservedObject、@Published 等特性。以及如何从服务器获取数据,实现新闻咨询的动态更新。
【关注「知晓云」公众号,点击菜单栏「知晓云」-「知晓课堂」,获取更多开发教程。】

1b05c5282bcc9dda6be4974f99da0bee.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【课程特点】1、231节大容量课程:包含了SwiftUI的大部分知识点,详细讲解SwiftUI的方方面面;2、15个超级精彩的实例:包含美食、理财、健身、教育、电子商务等各行业的App实例;3、创新的教学模式:手把手教您SwiftUI用户界面开发技术,一看就懂,一学就会;4、贴心的操作提示:让您的眼睛始终处于操作的焦点位置,不用再满屏找光标;5、语言简洁精练:瞄准问题的核心所在,减少对思维的干扰,并节省您宝贵的时间;6、视频短小精悍:即方便于您的学习和记忆,也方便日后对功能的检索;7、齐全的学习资料:提供所有课程的源码,在Xcode 11 + iOS 13环境下测试通过; 更好的应用,更少的代码!SwiftUI是苹果主推的下一代用户界面搭建技术,具有声明式语法、实时生成界面预览等特性,可以为苹果手机、苹果平板、苹果电脑、苹果电视、苹果手表五个平台搭建统一的用户界面。SwiftUI是一种创新、简单的iOS开发中的界面布局方案,可以通过Swift语言的强大功能,在所有的Apple平台上快速构建用户界面。 仅使用一组工具和API为任何Apple设备构建用户界面。SwiftUI具有易于阅读和自然编写的声明式Swift语法,可与新的Xcode设计工具无缝协作,使您的代码和设计**同步。自动支持动态类型、暗黑模式、本地化和可访问性,意味着您的**行SwiftUI代码已经是您编写过的非常强大的UI代码了。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值