previewProvider на SwiftUI не загружается

#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)
    }
}