如何在启动时显示 NavigationView (SwiftUI) 的详细视图

Posted

技术标签:

【中文标题】如何在启动时显示 NavigationView (SwiftUI) 的详细视图【英文标题】:How to display a detailed view on startup for a NavigationView (SwiftUI) 【发布时间】:2021-10-03 14:20:26 【问题描述】:

This tutorial 使用NavigationView 显示可以单击的元素的List,从而导致详细视图LandmarkDetail。在 iPhone 上,UI 使用 StackNavigationViewStyle(),它看起来和工作正常,但在 iPad 上,NavigationView 显示在侧面。我希望能够用详细视图填充剩余空间(见下文)。

我尝试在NavigationView 旁边显示详细视图LandmarkDetail,如下所示:

var body: some View 
        NavigationView 
            List 
                Toggle(isOn: $showFavoritesOnly) 
                    Text("Favorites only")
                

                ForEach(filteredLandmarks)  landmark in
                    NavigationLink(destination: LandmarkDetail(landmark: landmark)) 
                        LandmarkRow(landmark: landmark)
                    
                
            
            .navigationTitle("Landmarks")
            
            LandmarkDetail(landmark: ModelData().landmarks[0])
        
    

这种方法适用于 iPad,但在 iPhone 上会产生意想不到的结果(重叠的图块等)(见下文)。有没有更好的方法来实现我想要的结果?

感谢您的帮助,对于潜在的明显错误等,我深表歉意。这是我第一次使用 SwiftUI,可用资源明显少于 android 开发。

【问题讨论】:

即使在iPhone上,在横屏模式下有足够大的屏幕,相信你也会得到iPad风格的列表和详细视图同时显示的系统。因此,您可能想要检查尺寸等级并仅在尺寸等级足够大时有条件地显示LandmarkDetail。可能有更好的解决方案,但这就是我立即想到的。 您能提供一种检查方法吗?我尝试过使用 Size Classes,但没有运气。 hackingwithswift.com/quick-start/swiftui/… 很遗憾,结果相同,但感谢您的帮助。 【参考方案1】:

根据目标设备创建以编程方式分配NavigationView 样式的修饰符修复了此问题。

extension View 

    func navigationStyleModification() -> some View
    
        if UIDevice.current.userInterfaceIdiom == .phone
        
            return AnyView(self.navigationViewStyle(StackNavigationViewStyle()))
         else
        
            return AnyView(self.navigationViewStyle(DefaultNavigationViewStyle()))
        
    

修饰符可以通过以下方式调用:

NavigationView 

    ...
.navigationStyleModification()

我希望这对遇到类似问题的人有所帮助。

【讨论】:

以上是关于如何在启动时显示 NavigationView (SwiftUI) 的详细视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在应用启动和退出时显示 Admob 插页式广告

如何在启动时显示 KivyMD 数据表?

如何在应用程序启动时显示锁定屏幕?

如何在 Emacs 启动时显示 Org 模式议程?

如何使用 VBA 在 Outlook 365 上启动时显示所有日历?

如何在应用程序每 3 次启动时显示弹出窗口?