objective-c - 在 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 并将其重新启动时,自定义视图被按下如下:
不知道为什么会这样,而且我很确定有更好的方法来做这一切,但我似乎找不到。我希望这里有人可以提供一些指示
解决方案
推荐阅读
- unix - 为一列数字中的每个元素添加小数点
- react-native - 适用于 IOS 和 Android 的推送通知的最佳方法
- dart - 如何投射/转换未来
成图像? - javascript - 如何使此弹出代码弹出 50% 一个站点和 50% 另一个站点?
- android - Android ABI 拆分迁移到 App Bundle
- php - 使用工厂确保单个实例行为
- java - 是否可以使用两个版本的 SLF4J?
- java - 如何解决 H2“执行 DDL 时出错”错误?
- sql - 数百万不同类型值的高效存储模式
- angular - 如何使用 Sqlite3 从 Angular/Spring Boot 存储图像