И это выглядит так:
Код: Выделить всё
struct MainTabView: View {
@ObservedObject var viewModel: TabViewModel
var body: some View {
TabView {
ForEach(viewModel.tabs, id: \.title) { tab in
tab.view
.tabItem {
Image(systemName: tab.imageName)
Text(tab.title)
}
}
}
}
}
struct HomeView: View {
var body: some View {
VStack {
Text("Home")
.font(.largeTitle)
.padding()
Spacer()
}
}
}
class TabViewModel: ObservableObject {
@Published var tabs: [TabItem] = [
TabItem(title: "Home", imageName: "house.fill", view: AnyView(HomeView()))
]
}
struct TabItem {
let title: String
let imageName: String
let view: AnyView
}
Пожалуйста, может ли кто-нибудь объяснить мне, как работать с конкретными типами и внедрением зависимостей в SwiftUI в контексте приведенного выше кода?< /p>
Я пробовал использовать такие протоколы:
Код: Выделить всё
protocol TabViewProviding {
var title: String { get }
var imageName: String { get }
var tabView: any View { get }
}
protocol TabViewModelProviding: ObservableObject {
var tabs: [TabViewProviding] { get }
}
Код: Выделить всё
Static method 'buildExpression' requires that 'Content' conform to 'AccessibilityRotorContent'#edit
поэтому, учитывая комментарий @lorem ipsum, я думаю, это лучший подход:
Код: Выделить всё
struct MainTabView: View {
@ObservedObject var viewModel: ViewModel
var body: some View {
TabView {
ForEach(viewModel.tabs, id: \.title) { tab in
createTabFor(tabType: tab.type)
.tabItem {
Image(systemName: tab.imageName)
Text(tab.title)
}
}
}
}
@ViewBuilder
func createTabFor(tabType: TabType) -> some View {
switch tabType {
case .recipes:
RecipeListView()
case .settings:
SettingsView()
}
}
}
protocol TabViewModelProviding: ObservableObject {
var tabs: [TabItemProviding] { get }
}
class TabViewModel: TabViewModelProviding {
@Published var tabs: [TabItemProviding] = [
TabItem(title: "Recipes", imageName: "wineglass.fill", type: .recipes),
TabItem(title: "Settings", imageName: "gearshape.fill", type: .settings)
]
}
enum TabType {
case settings
case recipes
}
protocol TabItemProviding {
var title: String { get }
var imageName: String { get }
var type: TabType { get }
}
struct TabItem: TabItemProviding {
let title: String
let imageName: String
let type: TabType
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... ific-types
Мобильная версия