Работа с Xcode 10.1 и Swift 4.2
У меня есть сложное приложение, которое использует UINavigationController
, реализованное в AppDelegate
.
rootViewController для navigationController - это класс DashboardController()
(подкласс UIViewController
)
DashboardController
реализует левый блок меню с использованием нескольких контроллеров ViewC (с self.addChild(viewController)
)
Все работает отлично, кроме случаев, когда мне нужно нажать viewController, чтобы представить BarCodeScannerView().
Базовый код barCodeScannerView может быть нажатым и выдвинутым , как и ожидалось.
Проблемы возникают, когда я запрашиваю доступ к камере (только в первый раз).
Как только я представлю Device.requestAccess(for:)
следующим образом: viewController имеет значение popped , и будет представлено предыдущее представление (rootViewController). (Все еще с «Приложение хочет получить доступ к камере» AlertView)
func requestCameraAccess () {
AVCaptureDevice.requestAccess (для: AVMediaType.video) {предоставлено в
если предоставлено {
self.launchScanner ()
} еще {
self.goBack ()
}
}
}
Если я нажму «ОК», система зарегистрирует, что доступ был предоставлен, но
applicationDidBecomeActive
(в AppDelegate
) вызывается примерно через 1 секунду. У меня есть несколько инициализаторов в applicationDidBecomeActive
, и все они выполняются снова. И после небольшой задержки все работает нормально.
Кстати: applicationWillResignActive
, applicationDidEnterBackground
и applicationWillEnterForeground
НЕ вызываются. Итак, ясно, что это не часть жизненного цикла приложения.
Есть идеи, что я могу здесь делать? Что может сделать системный вызов applicationDidBecomeActive
в приложении? и до сих пор все работает?
Спасибо заранее ...
ОБНОВЛЕНИЕ После прочтения комментариев я смог выделить проблему № 2 следующим образом:
Простой / базовый проект с UINavigationController
с приборной панелью ViewController в виде rootViewController
. DashboardViewController помещает CameraViewController()
в viewDidLoad()
. CameraViewController запрашивает доступ к камере. При нажатии кнопки OK вызов applicationDidBecomeActive
запускается.
Полный проект прилагается. (кроме ключа «Конфиденциальность - описание использования камеры» в .plist.
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow? = UIWindow()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let dashboardViewController = DashboardViewController()
window?.rootViewController = UINavigationController(rootViewController: dashboardViewController)
window?.makeKeyAndVisible()
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
print("applicationDidBecomeActive")
}
func applicationWillResignActive(_ application: UIApplication) {}
func applicationDidEnterBackground(_ application: UIApplication) {}
func applicationWillEnterForeground(_ application: UIApplication) {}
func applicationWillTerminate(_ application: UIApplication) {}
}
class DashboardViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
let cameraVC = CameraViewController()
self.navigationController?.pushViewController(cameraVC, animated: true)
}
}
import AVFoundation
class CameraViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
AVCaptureDevice.requestAccess(for: AVMediaType.video) { granted in
if granted {
print("Access granted")
}
}
}
}