swiftui TabView 在设备下呈现 UIViewControllerRepresentable 的意外行为

Posted

技术标签:

【中文标题】swiftui TabView 在设备下呈现 UIViewControllerRepresentable 的意外行为【英文标题】:Unexpected behavior with swiftui TabView presenting UIViewControllerRepresentable under device 【发布时间】:2020-09-11 20:04:21 【问题描述】:

这是我的问题的简化版本,我最初在尝试迁移到 swiftui 时遇到了现有项目。

我用“Tabbed App”开始一个新项目,选择“swiftui”作为UI元素。

然后我创建了 4 个名为“Test1.storyboard”...“Test4.storyboard”的故事板文件,每个文件都有一个 UIView 控制器和一个带有“Test 1”....“Test 4”的 uilabel,分别编写,我检查所有这些上的“是初始视图控制器”框。

为了加载视图,我创建了 UIViewControllerRepresentable 的子类:

struct PlainStoryboardViewController: UIViewControllerRepresentable 
    
    var storyBoardName: String
    
    func makeUIViewController(context: Context) -> UIViewController 
        debugPrint("Showing \(self.storyBoardName)")
        let storyBoard = UIStoryboard(name: self.storyBoardName, bundle: nil)
        let vc = storyBoard.instantiateInitialViewController()!

        return vc
    

    func updateUIViewController(_ pageViewController: UIViewController, context: Context) 
    

现在我只需将生成的 ContentView 中的 Text("blah") 替换为我的 PlainStoryboardViewController,并添加其他 2 个额外按钮,这就是我所做的一切......但为了完整性,这里是:

struct ContentView: View 
    @State private var selection = 0
 
    var body: some View 
        TabView(selection: $selection)
            PlainStoryboardViewController(storyBoardName: "Test1")
                .font(.title)
                .tabItem 
                    VStack 
                        Image("first")
                        Text("First")
                    
                
                .tag(0)
            PlainStoryboardViewController(storyBoardName: "Test2")
                .font(.title)
                .tabItem 
                    VStack 
                        Image("second")
                        Text("Second")
                    
                
                .tag(1)
            PlainStoryboardViewController(storyBoardName: "Test3")
                .font(.title)
                .tabItem 
                    VStack 
                        Image(systemName: "pencil")
                        Text("Third")
                    
                
                .tag(2)
            PlainStoryboardViewController(storyBoardName: "Test4")
                .font(.title)
                .tabItem 
                    VStack 
                        Image(systemName: "trash")
                        Text("Fourth")
                    
                
                .tag(3)
        
    

看起来很简单,当我点击 4 个按钮时,我希望加载相应的页面,它确实如此......在模拟器上,我的 iphone 上,但随后在 ipad 上失败。

它有时会加载正确的页面,但大多数时候它只是刷新当前页面(我在原始项目的 ViewDidAppear 下打印,但我假设它在这里做同样的事情)。例如,我在“第二”,然后单击“第三”,我希望它加载“测试 3”,但它会转到“测试 3”或刷新“测试 2”。您稍等片刻,然后再试一次,它会起作用,或者只是再次刷新。

这是经过测试的,并且在运行 ios 13.7 的 iPad mini4 和 11.5 英寸 ipad pro 上重现了该问题。但它与同样在 ios 13.7 下运行的 iphone X 一样工作。该项目使用 xcode 11.7 部署目标 13.7 构建

【问题讨论】:

运气好,我也面临类似的问题。 ***.com/questions/69470968/… @Bhupesh Kumar Nope.... 不幸的是,在遇到 swiftui 的一系列问题后,我放弃了它,我的生活变得更好了。 【参考方案1】:

确保指定 .tabViewStyle(PageTabViewStyle()) 以便 TabView 不使用 iPad 样式。

【讨论】:

以上是关于swiftui TabView 在设备下呈现 UIViewControllerRepresentable 的意外行为的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI TabView 与 PageTabViewStyle 在设备上的横向与 safeArea 添加奇数前沿插图

Lottie 动画在 SwiftUI 的最后一个 TabView 页面上消失

如何复制 UIKit/SwiftUI 元素背景(如 UITabBar/TabView 背景)

SwiftUI 有啥方法可以创建一个 TabView 来显示 Tab Item 下面的 View

在 SwiftUI 中构建一个自定义的类 TabView 视图

在 TabView 中设置 SwiftUI PageTabViewStyle 垂直流向