Swift 嵌套Sheet页返回问题
Swift 嵌套Sheet页返回问题

Swift 嵌套Sheet页返回问题

问题复现

在Swift当中,当尝试打开一个一级Sheet页面,并在该Sheet页面中打开一个二级Sheet页面,如果关闭二级的Sheet页面时,一级Sheet页面也会被关闭,而不是仅关闭二级Sheet页。

例如在截图当中,我们首先打开的一级Sheet页面是左边的设置页面,点击“问题反馈”后调用对应的邮件功能,这个邮件页面就是我们的二级页面。当我们在处理完邮件页面之后,想要点击“取消”按钮退出时,我们并不会返回到一级Sheet页面(设置页),而是退出整个Sheet页面,返回到主页面当中。

解决方案

经过一系列的测试,发现目前比较好的方案就是通过设置NavigationStack和NavigationLink来解决该问题。

我们在主页面大概一级Sheet页后,不再设置一个二级的Sheet页,而是将这个页面设置NavigationLink打开,通过在Sheet内部使用NavigationStack,可以实现层级导航,这样可以返回到上一次页面。

因此本质上只有一个Sheet页,所以也具备退出Sheet页直接返回到首页的功能。

在上图当中,原本的计划是设置页作为一级Sheet页,邮件则作为二级Sheet页,但实际过程中发现退出二级邮件页面时,整个Sheet页都会退出(一级、二级都退出),并返回到首页。

刚才提出的解决方案是在设置页使用NavigationStack,将原本为Sheet页打开的邮件页面改为一个NavigationLink。这样,当我们点击“问题反馈”并打开邮件页面时,实际是打开了一个NavigationLink链接的视图。

这样,当我们点击邮件页面左上角的“设置”按钮时,返回的就是我们的设置页面。当我们在邮件页面下拉时,根据Sheet的特性就会直接退出Sheet页面,回到我们的首页。

struct Settings: View {
    @State var path = NavigationPath()
    var body: some View {
        NavigationStack(path: $path){
            NavigationLink(destination: {
                MailComposeViewController()
            }, label: {
                // 文本内容
            })
        }
    }
}

问题总结

目前来看,Swift暂时还不支持嵌套Sheet页返回上一层Sheet页,当存在嵌套Sheet页时,关闭当前的Sheet页,会导致Swift关闭所有的Sheet页,而不是依次返回的情况。

当我们想要尝试在Sheet页中展示一些内容,但又因为嵌套Sheet造成不能依次返回的情况时,我们应该使用NavigationStack和NavigationLink来处理想要嵌套的Sheet页。

这样,我们就能够在一个比较优美的Sheet页上面,打开新的视图并展示对应的内容信息。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注