Как мне смоделировать свою логику при разделении представления SwiftUI на отдельные подпредставления?IOS

Программируем под 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». Я упускаю что-то очевидное?
Как бы вы к этому подошли?

Спасибо.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»