适用于iOS 15/16的SwiftUI NavigationView与NavigationStack



我正试图让我的iPhone应用程序(针对iOS 15及以上版本(与iOS 16完全兼容,但没有成功!

我不知道如何在同一段代码中包含适用于iOS 15的NavigationView和适用于iOS 16的NavigationStack

Xcode:不接受上面的代码

if #available(iOS 16, *) {
NavigationStack {
} else {
NavigationView {
}

发件人:SwiftUI导航视图/堆栈(如果可用(iOS 15/16

我想,按照@timmy的建议,创建一个自定义容器将是唯一的解决方案。但我不知道该怎么办。

那么解决方案是什么呢?

就我个人而言,除非我以iOS 16+为目标,否则我不会使用NavigationStack,但如果你想这样做,你可以制作自己的导航包装

struct MyNavigation<Content>: View where Content: View {
@ViewBuilder var content: () -> Content

var body: some View {
if #available(iOS 16, *) {
NavigationStack(root: content)
} else {
NavigationView(content: content)
}
}
}

然后使用它,就像你使用NavigationStackNavigationView一样,在iOS 15或更高版本上,它会使用NavigationView,在iOS 16或更高级别上,它将使用NavigationStack

Xcode不接受您的代码,因为它无效。在同一块中,如果没有},就不能有{

我发现在iOS 16下运行的iPhone和iPad应用程序上使用NavigationView都会出现问题,尽管NavigationView目前只是不推荐使用。在iPhone上,从NavigationLink访问的视图通常一打开就关闭。在iPad上,同样的问题也会发生,后退箭头的生成似乎有点随机,尤其是在文档应用程序中。我发现使用NavigationSplitViewNavigationStack非常值得,尽管这需要我编写大量额外的代码来获得令人满意的结果,尤其是在设计为在iPhone和iPad上都能以最佳状态运行的应用程序中。也就是说,苹果确实提供了一些关于如何在这里采用新观点的明确建议。

我在iOS 16上遇到了另一个怪事。模式工作表中的选取器(其列表数组填充为.onAppear(不再按预期工作,选取器选择也不能再通过编程设置。在激活模式工作表并将其作为Binding传递给工作表之前,您必须填充Picker的列表。

感谢halo提供的关于如何使用if #available()的最重要提示。

最新更新