首页 > 解决方案 > 在 SwiftUI 中用自定义视图替换 TabBar

问题描述

我有一个使用 UITabBarController 进行导航的旧 Objective-c 项目,我在其中一个选项卡中添加了一个网格视图(使用 swiftUI)。为此,我将 swiftUI 视图嵌入到主机控制器中。请参见下图显示当前情节提要:

在此处输入图像描述

加载网格视图工作正常:

在此处输入图像描述

现在,问题来了。我需要做的是:当用户按下时Select,我需要用自定义视图替换标签栏。例如:

在此处输入图像描述

我通过让 UIHostController 在用户点击时隐藏栏来完成上述操作,Select如下所示:

class GridViewModel: ObservableObject {
@Published var isSelectModeEnabled = false
}

class GridViewHostController: UIHostingController<GridView> {
     private let gridViewModel = GridViewModel()
     required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder, rootView: GridView(model: gridViewModel))
     }

     @IBAction func onSelect(_ sender: Any) {
        guard let tabBarController = self.tabBarController else { return }
        let isSelectModeEnabled = !tabBarController.tabBar.isHidden
        tabBarController.tabBar.isHidden = isSelectModeEnabled
        gridViewModel.isSelectModeEnabled = isSelectModeEnabled
    }
 }

然后在 swiftUI 中,我有:

struct GridView: View {
@ObservedObject var model: GridViewModel
var columns: [GridItem] = Array(repeating: .init(.flexible(), spacing: 3), count: 3)
var body: some View {
    ZStack(alignment: .bottomTrailing) {
        ScrollView {
            LazyVGrid(columns: columns, spacing: 0) {
                ForEach(0...100, id: \.self) { j in
                    Rectangle().fill(Color.yellow).frame(width: 80, height: 80).padding()
                }
            }
        }
        
        if model.isSelectModeEnabled {
            VStack() {
                Spacer()
                Rectangle().fill(Color.gray).frame(height: 88).offset(x: 0, y: 90)
            }
        }
    }
  }
}

上面的问题之一是,当我最小化 APP 并将其重新启动时,自定义视图被按下如下:

在此处输入图像描述

不知道为什么会这样,而且我很确定有更好的方法来做这一切,但我似乎找不到。我希望这里有人可以提供一些指示

标签: objective-cswiftuiuitabbarcontroller

解决方案


推荐阅读