gpt4 book ai didi

SwiftUI:再次点击选定的选项卡时弹出到 Root View

转载 作者:行者123 更新时间:2023-12-03 09:20:19 25 4
gpt4 key购买 nike

起点是 TabView 中的 NavigationView。当再次点击所选选项卡时,我正在努力寻找一个 SwiftUI 解决方案以弹出到导航堆栈中的 Root View 。在 SwiftUI 之前的时代,这很简单:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
let navController = viewController as! UINavigationController
navController.popViewController(animated: true)
}

你知道如何在 SwiftUI 中实现同样的功能吗?

目前,我使用以下依赖于 UIKit 的解决方法:
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)

let navigationController = UINavigationController(rootViewController: UIHostingController(rootView:
MyCustomView() // -> this is a normal SwiftUI file
.environment(\.managedObjectContext, context)
))
navigationController.tabBarItem = UITabBarItem(title: "My View 1", image: nil, selectedImage: nil)

// add more controllers that are part of tab bar controller

let tabBarController = UITabBarController()
tabBarController.viewControllers = [navigationController /*, additional controllers */]

window.rootViewController = tabBarController // UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}

最佳答案

这是可能的方法。对于 TabView它提供与点击另一个选项卡并返回相同的行为,因此具有持久的外观和感觉。

经过测试并与 Xcode 11.2/iOS 13.2 一起使用

demo

完整的模块代码:

import SwiftUI

struct TestPopToRootInTab: View {
@State private var selection = 0
@State private var resetNavigationID = UUID()

var body: some View {

let selectable = Binding( // << proxy binding to catch tab tap
get: { self.selection },
set: { self.selection = $0

// set new ID to recreate NavigationView, so put it
// in root state, same as is on change tab and back
self.resetNavigationID = UUID()
})

return TabView(selection: selectable) {
self.tab1()
.tabItem {
Image(systemName: "1.circle")
}.tag(0)
self.tab2()
.tabItem {
Image(systemName: "2.circle")
}.tag(1)
}
}

private func tab1() -> some View {
NavigationView {
NavigationLink(destination: TabChildView()) {
Text("Tab1 - Initial")
}
}.id(self.resetNavigationID) // << making id modifiable
}

private func tab2() -> some View {
Text("Tab2")
}
}

struct TabChildView: View {
var number = 1
var body: some View {
NavigationLink("Child \(number)",
destination: TabChildView(number: number + 1))
}
}

struct TestPopToRootInTab_Previews: PreviewProvider {
static var previews: some View {
TestPopToRootInTab()
}
}

关于SwiftUI:再次点击选定的选项卡时弹出到 Root View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60690933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com