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

Программируем под IOS
Ответить
Anonymous
 Как передать модель представления из родительского представления в дочернее представление?

Сообщение Anonymous »

В качестве учебного упражнения я экспериментирую с использованием протоколов в сочетании с MVVM. Большинство представлений в моем обучающем приложении имеют единую модель представления, использующую протокол, поэтому я могу создать макет для предварительного просмотра и тестирования.
Представление выглядит следующим образом:

Код: Выделить всё

struct ContentView: View {
@State var contentModel: ContentModelProtocol

init(contentModel: ContentModelProtocol = ContentModel()) {
_contentModel = State(initialValue: contentModel)
}

var body: some View {
// The view's body that uses the model
}
}

#Preview {
ContentView(contentModel: ContentModelMock())
}
А модель, ее протокол и макет выглядят так:

Код: Выделить всё

@MainActor
protocol ContentModelProtocol: Observable {
var value1: String { get }
var value2: Int { get }

func usefulFunction()
}

@MainActor
@Observable
class ContentModel: ContentModelProtocol {
var value1: String = ""
var value2: Int = 0

func usefulFunction() {
// Function's body
}
}

@MainActor
@Observable
class ContentModelMock: ContentModelProtocol {
var value1: String = ""
var value2: Int = 0

func usefullFunction() {
// Function's body
}
}
Изначально я создал дочернее представление и попытался передать модель представления с помощью конструктора:

Код: Выделить всё

struct ChildView: View {
@Bindable var contentModel: ContentModelProtocol

init(contentModel: ContentModelProtocol = ContentModel()) {
_contentModel = Bindable(wrappedValue: contentModel)
}
}
Но это приводит к ошибке: init(wrappedValue: недоступен: обернутое значение должно быть объектом, соответствующим Observable с подсообщением init(wrappedValue:) здесь явно отмечено как недоступное (SwiftUI.Bindable.init). Ошибка появляется как в конструкторе, так и в contentModel поле.
Решением было бы, чтобы родительское представление добавляло модель представления в среду, а дочернее представление получало ее оттуда. Это должно работать с протоколом, позволяющим использовать макет для тестирования и предварительного просмотра. Однако теперь мне интересно, как это сделать без использования среды, я не могу себе представить, что это невозможно.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... child-view
Ответить

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

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

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

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

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