SwiftUI|让 NavigationLink 惰性加载

使用惰性视图让 SwiftUI 的 NavigationLink 惰性加载导航目标视图。

SwiftUI|让 NavigationLink 惰性加载
Photo by Annie Spratt / Unsplash

最近我在使用 NavigationLink 的时候发现,一旦视图被加载,NavigationLink 里面的 View 也会被创建和初始化。

例如下面代码创建了一个带有 NavigationLink 的视图。

struct MainPanelView: View {
    var body: some View {
        VStack {
            HStack {
                NavigationLink("Titile") {
                    let model = ...
                    return ItemView(model: model)       
                }
                Spacer()
            }
            
            // ...
        }
    }
}

我预想的是,当用户点击 NavigationLink 时,内部的 ItemView 才会被创建和加载。这样创建 ItemView 所用的 model 就能根据点击时的页面状态生成。

但事与愿违,一旦 MainPanelView 被显示,NavigationLink 内部的 ItemView 也会被创建。ItemView 似乎被当作了 MainPanelView 的一个子视图——当 MainPanelView 显示时,系统认为 ItemView 也要显示,所以就把它也一起创建了。这样就导致我给 ItemView 的初始化方法传递的参数都是一些默认值,并不是用户点击时的页面数据。

事实上,NavigationLink 会在其被创建时,立即创建它的目标视图(destination view)。这一行为甚至会在 NavigationLink 没有展示在屏幕上时触发。这一点和 UIKit/AppKit 框架不同。

解决这个问题需要使用一个懒加载的视图将目标视图包裹一下。

public struct LazyView<Content: View>: View {
    let build: () -> Content
    public init(_ build: @escaping () -> Content) {
        self.build = build
    }
    public var body: Content {
        build()
    }
}

这样就会在 SwiftUI 想要渲染 LazyView 的 body 时再创建导航目标视图,做到按需创建。

Read more

iOS 18 初体验

iOS 18 初体验

错过了凌晨的的 WWDC24 发布会,今早从各大媒体中获悉了此次版本更新的主要内容。与之前爆料的内容相近,此次更新主要是针对 AI 、桌面和隐私等。 到公司后发现 iOS 18 的开发者预览版已经可以安装了。于是到工位立马插电开始下载更新系统。这也是我第一次在自己日常使用的设备上安装 beta 版系统,之前都是在测试机上尝鲜。 下面是系统更新之后的一些体验。 控制中心更灵活了 * 控制中心左上角增加了一个加号➕按钮,点击后可以添加更多控制中心选项(长按空白区域也能触发)。这个功能是把「设置」中的控制中心设置挪到了控制中心面板上。 * 右上角增加了一个电源按钮,点击后可以选择是否要滑动关机,取消后立即进入锁定状态,必须使用密码才能解锁。 * 控制中心支持翻页了。可以上下滑动切换页面,目前我的设备上分页分别为「常用」「音乐」「网络连接」。如果开启了「家庭」的话,还会多一个家庭的分页。实测这个分页会影响控制中心的关闭手势—想要上滑关闭控制中心时,系统却将其识别成了上滑翻页。子页面可以通过长按移出和添加。 * 控制中心选项按钮支持调节大小了,并且支持了更多类型的选项(甚至可以

By Gray
绘画临摹·其一

绘画临摹·其一

新 iPad Pro 到手后,我第一时间把几年前买的 procreate 重新下载安装到了新设备上。我自知我没有多少艺术细胞,但还是按耐不住内心创作的渴望。尤其是前段时间看了《月亮和六便士》之后,这种渴望就愈来愈强了。 生命在于创作。绘画是一种创作的形式,也是表达和记录生活的一种方式。我在小红书上收藏了一些绘画的笔记,照着临摹了一些。 第一张我给它起名叫《日》。图层比较简单,依靠一些色彩和高斯模糊特效就可以完成。整体效果还是不错的~ 第二幅是雨天景色,主题色是绿。原作者画的很棒,但是我临摹的不太行,好多细节没有处理好,比如山峦的边缘没有涂抹好,山峦缺乏层次感,山峦和水面(是的,底下是水…)的交界处也没有清晰的表示出来,水面颜色不够通透。原作里面有几头牛,我实在画不出来,索性放弃了。 原作链接: 小红书 端午粽子简笔画。这个还是比较简单的。 原帖: 小红书 蓝天白云。 原帖: 小红书

By Gray