这是我问题的简化版本,我最初是在尝试迁移到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) {
}
}
现在,我只用我的PlainStoryboardViewController替换生成的ContentView中的Text(“ blah”),并添加其他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和ipad pro 11.5英寸再现了该问题。但是,它也可以在ios 13.7下运行的iphone X正常工作。该项目是使用xcode 11.7部署目标13.7构建的。
答案 0 :(得分:0)
确保指定.tabViewStyle(PageTabViewStyle()),以便TabView不使用iPad样式。