#ios #swift #swiftui
#iOS #swift #swiftui
Вопрос:
сегодня мне интересно, можно ли работать над созданием представления на SwiftUI, используя PreviewProvider
Это сложно, когда у вас есть модели, потому что вам нужно «инициализировать» каждую модель и атрибут, чтобы увидеть эмулятор пользовательского интерфейса. Например
struct SimpleView: View {
@State private var number : Int
var body: some View {
ScrollView{
VStack{
Text(String(number))
}
}
}
}
struct SimpleView_Previews: PreviewProvider {
static var previews: some View {
SimpleView(Int: 5)
}
}
Предварительный просмотр пользовательского интерфейса работает хорошо!
Но что, если мне нужно использовать пользовательский объект с 40-70 свойствами … : (
Есть ли способ работать без «жесткого кода» в начале?
Большое вам спасибо
Комментарии:
1. Обычно я либо создаю
MockViewModel
соответствующий подклассViewModel
, либо, если модель представления является структурой, я создаю статическую функцию в структуре, которая возвращает соответствующий «макет» экземпляра структуры.2. с 40-70 свойствами — никогда этого не делайте — разделяйте на мелкие части, чем меньше, тем лучше.
3. Я постараюсь разделить эти модели, потому что загрузка всей модели раздражает (к сожалению, существует так много моделей, которые работают вместе! Я имею в виду форму адреса с 20 атрибутами, такими как почтовый индекс, адрес электронной почты, имя, телефон… Это беспорядок)
4. @Paulw11 не могли бы вы показать мне пример, пожалуйста?
Ответ №1:
Один из подходов заключается в создании mockViewModel
свойства класса, которое возвращает экземпляр с фиксированными значениями, которые можно использовать для предварительного просмотра.
В этом примере объект резервной модели является объектом, управляемым основными данными.
При обычном использовании вы вызываете ProjectDetailViewModel(project:)
инициализатор.
Для предварительного просмотра вы можете использовать mockViewModel
свойство
class ProjectDetailViewModel: ObservableObject {
@Published var name: String {
didSet {
self.project.name = name
}
}
@Published var notes: String {
didSet {
self.project.notes = notes
}
}
let project: Project!
init(project: Project) {
self.project = project
name = project.name ?? ""
notes = project.notes ?? ""
}
private init() {
project = nil
name = "Mock project"
threePhase = false
notes = "Mock Notes"
}
static var mockViewModel:ProjectDetailViewModel {
return ProjectDetailViewModel()
}
}
struct ProjectDetailView_Previews: PreviewProvider {
static var previews: some View {
ProjectDetailView(project: ProjectDetailViewModel.mockViewModel)
}
}