Сегодня мне интересно, можно ли разработать представление 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 свойствами ... :(

Есть ли способ работать без "жесткого кода" вначале?

Огромное спасибо

0
Antonio Labra 10 Дек 2020 в 03:44

1 ответ

Лучший ответ

Один из подходов - создать свойство класса mockViewModel, которое возвращает экземпляр с фиксированными значениями, которые можно использовать для предварительного просмотра.

В этом примере объект резервной модели - это управляемый объект Core Data.

При нормальном использовании вы вызываете инициализатор 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)
    }
}
1
Paulw11 10 Дек 2020 в 07:33