Хостинг-контроллер при использовании iOS 14 @main - PullRequest
0 голосов
/ 06 августа 2020

Я экспериментирую с «чистым» приложением SwiftUI. У него нет SceneDelegate, поэтому я не уверен, где разместить вещи Hosting Controller, которые мне нужны, когда он будет работать на iOS.

Ранее в SceneDelegate I ' d есть код, который бы сказал что-то вроде:

let contentView = ContentView()
window.rootViewController = UIHostingController(rootView: contentView)

Теперь у меня есть только файл @main с:

var body: some Scene {
    WindowGroup {
        ContentView()
    }
}

Итак, где же материал Hosting Controller go (или как еще я могу получить доступ к функциям UIKit, которых нет в SwiftUI? (В частности, я хочу возиться со строкой состояния, автоматически скрывать домашний индикатор и кое-что о светлом / темном режиме, которые SwiftUI preferredColorScheme не покрывает .)

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Вот возможный подход (протестирован с Xcode 12 / iOS 14) ... но если вы намерены интенсивно использовать функции UIKit, лучше использовать жизненный цикл UIKit, поскольку он дает большую гибкость для настройки части UIKit .

struct ContentView: View {

    var body: some View {
      Text("Demo Root Controller access")
        .withHostingWindow { window in
            if let controller = window?.rootViewController {
                // .. do something with root view controller
            }
        }
    }
}

extension View {
    func withHostingWindow(_ callback: @escaping (UIWindow?) -> Void) -> some View {
        self.background(HostingWindowFinder(callback: callback))
    }
}

struct HostingWindowFinder: UIViewRepresentable {
    var callback: (UIWindow?) -> ()

    func makeUIView(context: Context) -> UIView {
        let view = UIView()
        DispatchQueue.main.async { [weak view] in
            self.callback(view?.window)
        }
        return view
    }

    func updateUIView(_ uiView: UIView, context: Context) {
    }
}
0 голосов
/ 06 августа 2020

Это будет зависеть от того, что вы хотите изменить, но вы можете использовать следующие модификаторы для ContentView .statusBar(hidden: true). Это также может быть размещено в частях приложения, где имеет смысл спрятать c в определенных обстоятельствах.

В этой статье есть отличный список всех новых доступных модификаторов. https://medium.com/better-programming/swiftui-views-and-controls-the-swift-2-documentation-youve-been-waiting-for-dfa32cba24f3#6299

...