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