SwiftUI: как работать с фреймворками, не поддерживающими симулятор, и PreviewProvider?

Я работаю над приложением RealityKit и использую SwiftUI.

Конечно, представление RealityKit не работает в PreviewProvider превью SwiftUI. Но моя проблема в том, что даже в простых и полностью изолированных представлениях SwiftUI предварительный просмотр невозможен, поскольку PreviewProvider необходимо скомпилировать весь проект.

Мои классы SwiftUI View никак не связаны с кодом ARView. Достаточно, если я просто перейду «Файл» -> «Новый» и выберу файл SwiftUI, а затем попытаюсь предварительно просмотреть его на холсте (⌥ + ⌘ + ↵) без каких-либо изменений. Тогда это даст мне эту ошибку. Тот факт, что в моем .xcodeproj есть какой-либо код, который не поддерживается предварительным просмотром холста, дает ошибку.

Я получаю такие ошибки:

Value of type 'ARView' has no member 'installGestures'

На данный момент у меня есть только два решения: 1) скопировать файл на игровую площадку и поэкспериментировать с ним там, а затем скопировать обратно, когда закончите. 2) закомментируйте весь неподдерживаемый код, связанный с RealityKit, прежде чем работать с представлением.

В: Конечно, ни одно из этих решений не является оптимальным. Есть ли лучшие решения?


person eivindml    schedule 21.08.2019    source источник
comment
Выполните поиск здесь по [xcode] быстрой условной сборке. Я получил 26 обращений, в том числе следующее: stackoverflow.com/questions/55133043/ Теперь, если эти результаты не помогут, удаление swift расширяет результаты до 188. Ваш ответ действительно - использовать Xcode для условной сборки. Но самый простой способ? Используйте устройство под управлением iOS 13. Я знаю, что это может быть невыполнимо, но вы, по крайней мере, почувствуете производительность в реальном времени и другие проблемы, о которых вы даже не задумывались.   -  person dfd    schedule 21.08.2019
comment
Это тоже происходит в Beta6? Я где-то читал, что это должна быть ошибка.   -  person Fabian    schedule 21.08.2019
comment
@Fabian Да, это тоже происходит с последней бета-версией. Вы помните, где вы это читали? Твиттер или блог?   -  person eivindml    schedule 21.08.2019
comment
К сожалению, больше нет, надеюсь, они исправят это, если возможно   -  person Fabian    schedule 21.08.2019
comment
Будем надеяться. Это похоже на ошибку, поскольку кажется разумным иметь возможность предварительно просмотреть изолированный файл представления SwiftUI, не зависящий от всех других несвязанных файлов в моем .xcodeproj.   -  person eivindml    schedule 21.08.2019


Ответы (2)


Я столкнулся с той же проблемой. Мое решение заключалось в использовании директивы компилятора targetEnvironment (simulator) следующим образом:

struct ContentView : View {
    
    var body: some View {
            #if !targetEnvironment(simulator)
            ARViewContainer()
                .edgesIgnoringSafeArea(.all)
                .statusBar(hidden: true)
            #endif
        }
    }
}

#if !targetEnvironment(simulator)
struct ARViewContainer: UIViewRepresentable {
    
    func makeUIView(context: Context) -> ARView {
        let arView = ARView(frame: .zero)

        // ARKit / RealityKit specific code
        ...

        return arView
        
    }
    
    func updateUIView(_ arView: ARView, context: Context) {}
}
#endif

Дополнительная литература: https://www.hackingwithswift.com/example-code/language/how-to-use-compiler-directives-to-detect-the-ios-simulator

person josh_dev    schedule 13.08.2020

В то время как новый симулятор в iOS 13 поддерживает Metal, ARView требует реального устройства для захвата кадров камеры и генерации данных слияния датчиков. И у него есть масса свойств и методов, которые вам нужно смоделировать, чтобы разрешить взаимодействие с другим кодом.

Можете ли вы абстрагироваться от взаимодействия ARView между SwiftUI через протокол, реализованный другим классом, например подклассом UIView или UIViewController? Если протокол достаточно прост, вы можете создать класс, который может имитировать взаимодействие, отвечая на ваши представления SwiftUI, как если бы он действительно взаимодействовал с ARView, без реализации всего API ARView.

Ваши представления SwiftUI, вероятно, не должны напрямую иметь дело с настройкой и произвольным доступом к свойствам и методам ARView. Вы можете создать оболочку вокруг ARView и представить логику и действия на уровне приложения, объединив издателей и подписчиков. Макетная версия, которая обертывает UIView и имеет те же публикации / подписки, может представлять простые визуальные подсказки, такие как изменение цвета, для представления различных состояний ARView и т. Д.

person Scott Ahten    schedule 21.08.2019
comment
Мои классы SwiftUI View никак не связаны с кодом ARView. Достаточно, если я просто выберу Файл - ›Новый и выберу файл SwiftUI, а затем попытаюсь предварительно просмотреть его на холсте (⌥ + ⌘ + ↵) без каких-либо изменений. Тогда это даст мне эту ошибку. Тот факт, что в моем .xcodeproj есть какой-либо код, который не поддерживается предварительным просмотром холста, дает ошибку. - person eivindml; 21.08.2019