Как мне смоделировать свою логику при разделении представления SwiftUI на отдельные подпредставления? ⇐ IOS
Как мне смоделировать свою логику при разделении представления SwiftUI на отдельные подпредставления?
Я только начинаю работать со SwiftUI, но у меня возникают некоторые проблемы с моделированием представлений и логики.
Давайте рассмотрим очень простую точку зрения:
[*]Сохраняет целочисленное значение [*]Имеет шаговый регулятор для изменения значения [*]Имеет кнопку для рандомизации значения [*]Включает/отключает действия в зависимости от того, является ли значение нечетным или четным. [*]Есть ли логика во внешнем виде
struct GlobalView: View { Значение @State var: Int = 0 var isFirstActionEnabled: Bool { значение % 2 == 0 } функция doFirstAction() { } var isRandomizeEnabled: Bool { значение % 2 != 0 } функция randomizeValue() { значение = .random(в: 0...100) } функция loadSomething() { } var body: some View { ВСтек { Степпер( «Значение: \(значение)», значение: $значение ) Кнопка( «Первое действие», действие: doFirstAction ) .disabled(!isFirstActionEnabled) Кнопка( «Рандомизировать», действие: рандомизироватьзначение ) .disabled(!isRandomizeEnabled) } .onAppear(выполнить: doSomething) } } Конечно, этот взгляд сам по себе прост и хорош.
Но предположим, что у меня есть более сложная логика/пользовательский интерфейс/форматирование/и т. д., и я хотел бы разделить это представление на отдельные подпредставления:
[*]Один ChildOneView, который отображает шаговый двигатель (и, возможно, обрабатывает собственную логику) [*]Один ChildTwoView, который отображает и выполняет первое действие (и, возможно, обрабатывает собственную логику) [*]Один ParentView, который объединяет эти два представления и может рандомизировать значения.
Вот как я реализовал ChildOneView (вместе с моделью представления, которая может управлять зависимостями и тестироваться):
class ChildOneViewModel: ObservableObject { @Опубликованное значение переменной: Int = 0 функция loadSomething() { } } структура ChildViewOne: Просмотр { @ObservedObject var viewModel: ChildOneViewModel var body: some View { Степпер( "Значение: \(viewModel.value)", значение: $viewModel.value ) .onAppear( выполнить: viewModel.loadSomething ) } } Вот как я реализовал ChildTwoView (вместе с моделью представления, которая может управлять зависимостями и тестироваться):
// Некоторые класс ChildTwoViewModel: ObservableObject { @Published var isEnabled: Bool = false функция firstAction() { } } структура ChildViewTwo: Просмотр { @ObservedObject вар viewModel: ChildTwoViewModel var body: some View { Кнопка( «Первое действие», действие: viewModel.firstAction ) .disabled(!viewModel.isEnabled) } } И вот как я определил ParentView:
import Объединить класс ParentViewModel: ObservableObject { пусть childOneViewModel: ChildOneViewModel пусть childTwoViewModel: ChildTwoViewModel @Published var isRandomizeEnabled: Bool = false var Cancellables: Set = [] в этом() { self.childOneViewModel = .init() self.childTwoViewModel = .init() self.childOneViewModel.$value .map { $0 % 2 == 0 } .sink(receiveValue: { [childTwoViewModel] в childTwoViewModel.isEnabled = $0 }) .store(в: &cancellables) self.childOneViewModel.$value .map { $0 % 2 != 0 } .sink(receiveValue: { [unowned self] в self.isRandomizeEnabled = $0 }) .store(в: &cancellables) } функция randomizeValue() { childOneViewModel.value = Int.random(в пределах: 0...100) } } структура ParentView: Просмотр { @ObservedObject var viewModel = ParentViewModel() var body: some View { ChildViewOne (viewModel: viewModel.childOneViewModel) ChildViewTwo(viewModel: viewModel.childTwoViewModel) Кнопка( «Рандомизировать», действие: viewModel.randomizeValue ) .disabled(!viewModel.isRandomizeEnabled) } } Похоже, что GlobalView в несколько представлений (ParentView, ChildOneView, ChildTwoView) добавляет много сложности , шаблонный код и возможные ошибки.
Еще раз, это пример, и Parent/ChildOne/ChildTwo должны иметь больше логики, в противном случае GlobalView и весь этот вопрос бессмысленен.
возможно, я думаю об этом слишком в духе «UIKit». Я упускаю что-то очевидное?
Как бы вы к этому подошли?
Спасибо.
Я только начинаю работать со SwiftUI, но у меня возникают некоторые проблемы с моделированием представлений и логики.
Давайте рассмотрим очень простую точку зрения:
[*]Сохраняет целочисленное значение [*]Имеет шаговый регулятор для изменения значения [*]Имеет кнопку для рандомизации значения [*]Включает/отключает действия в зависимости от того, является ли значение нечетным или четным. [*]Есть ли логика во внешнем виде
struct GlobalView: View { Значение @State var: Int = 0 var isFirstActionEnabled: Bool { значение % 2 == 0 } функция doFirstAction() { } var isRandomizeEnabled: Bool { значение % 2 != 0 } функция randomizeValue() { значение = .random(в: 0...100) } функция loadSomething() { } var body: some View { ВСтек { Степпер( «Значение: \(значение)», значение: $значение ) Кнопка( «Первое действие», действие: doFirstAction ) .disabled(!isFirstActionEnabled) Кнопка( «Рандомизировать», действие: рандомизироватьзначение ) .disabled(!isRandomizeEnabled) } .onAppear(выполнить: doSomething) } } Конечно, этот взгляд сам по себе прост и хорош.
Но предположим, что у меня есть более сложная логика/пользовательский интерфейс/форматирование/и т. д., и я хотел бы разделить это представление на отдельные подпредставления:
[*]Один ChildOneView, который отображает шаговый двигатель (и, возможно, обрабатывает собственную логику) [*]Один ChildTwoView, который отображает и выполняет первое действие (и, возможно, обрабатывает собственную логику) [*]Один ParentView, который объединяет эти два представления и может рандомизировать значения.
Вот как я реализовал ChildOneView (вместе с моделью представления, которая может управлять зависимостями и тестироваться):
class ChildOneViewModel: ObservableObject { @Опубликованное значение переменной: Int = 0 функция loadSomething() { } } структура ChildViewOne: Просмотр { @ObservedObject var viewModel: ChildOneViewModel var body: some View { Степпер( "Значение: \(viewModel.value)", значение: $viewModel.value ) .onAppear( выполнить: viewModel.loadSomething ) } } Вот как я реализовал ChildTwoView (вместе с моделью представления, которая может управлять зависимостями и тестироваться):
// Некоторые класс ChildTwoViewModel: ObservableObject { @Published var isEnabled: Bool = false функция firstAction() { } } структура ChildViewTwo: Просмотр { @ObservedObject вар viewModel: ChildTwoViewModel var body: some View { Кнопка( «Первое действие», действие: viewModel.firstAction ) .disabled(!viewModel.isEnabled) } } И вот как я определил ParentView:
import Объединить класс ParentViewModel: ObservableObject { пусть childOneViewModel: ChildOneViewModel пусть childTwoViewModel: ChildTwoViewModel @Published var isRandomizeEnabled: Bool = false var Cancellables: Set = [] в этом() { self.childOneViewModel = .init() self.childTwoViewModel = .init() self.childOneViewModel.$value .map { $0 % 2 == 0 } .sink(receiveValue: { [childTwoViewModel] в childTwoViewModel.isEnabled = $0 }) .store(в: &cancellables) self.childOneViewModel.$value .map { $0 % 2 != 0 } .sink(receiveValue: { [unowned self] в self.isRandomizeEnabled = $0 }) .store(в: &cancellables) } функция randomizeValue() { childOneViewModel.value = Int.random(в пределах: 0...100) } } структура ParentView: Просмотр { @ObservedObject var viewModel = ParentViewModel() var body: some View { ChildViewOne (viewModel: viewModel.childOneViewModel) ChildViewTwo(viewModel: viewModel.childTwoViewModel) Кнопка( «Рандомизировать», действие: viewModel.randomizeValue ) .disabled(!viewModel.isRandomizeEnabled) } } Похоже, что GlobalView в несколько представлений (ParentView, ChildOneView, ChildTwoView) добавляет много сложности , шаблонный код и возможные ошибки.
Еще раз, это пример, и Parent/ChildOne/ChildTwo должны иметь больше логики, в противном случае GlobalView и весь этот вопрос бессмысленен.
возможно, я думаю об этом слишком в духе «UIKit». Я упускаю что-то очевидное?
Как бы вы к этому подошли?
Спасибо.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение