问题复现
在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页上面,打开新的视图并展示对应的内容信息。