Сбой UIPresentationController просто указывает на AppDelegate
Скриншоты:
Я получаю много таких сбоев, но проблема в том, что я просто указываю на свою первую строку appDelegate. Я понятия не имею, где искать проблему. Любые идеи, где я мог бы начать расследование из следующего сообщения о сбое?
Crashed: com.apple.main-thread
0 UIKit 0x18d005640 __56-
[UIPresentationController runTransitionForCurrentState]_block_invoke + 460
1 UIKit 0x18cf27aa8 _runAfterCACommitDeferredBlocks + 292
2 UIKit 0x18cf1ae5c _cleanUpAfterCAFlushAndRunDeferredBlocks + 288
3 UIKit 0x18ccac464 _afterCACommitHandler + 132
4 CoreFoundation 0x1836a6cdc __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
5 CoreFoundation 0x1836a4694 __CFRunLoopDoObservers + 412
6 CoreFoundation 0x1836a4c50 __CFRunLoopRun + 1292
7 CoreFoundation 0x1835c4c58 CFRunLoopRunSpecific + 436
8 GraphicsServices 0x185470f84 GSEventRunModal + 100
9 UIKit 0x18cd1d5c4 UIApplicationMain + 236
10 AppName 0x100ae3ca4 main (AppDelegate.swift:23)
11 libdyld.dylib 0x1830e456c start + 4
Обновить:
Исходя из следующего:
Сбой приложения в runTransitionForCurrentState, но не знаю, почему
Я смотрю на возможные причины и задаюсь вопросом о следующем коде.
У меня есть следующая функция для представления представления с индикатором активности во время процесса синхронизации.
public func displayActivityAlertWithCompletion(_ title: String, ViewController: UIViewController, completionHandler: @escaping ()->())
{
let pending = UIAlertController(title: "\n\n\n"+title, message: nil, preferredStyle: .alert)
//create an activity indicator
let indicator = UIActivityIndicatorView(frame: pending.view.bounds)
indicator.autoresizingMask = [.flexibleWidth, .flexibleHeight]
indicator.color = UIColor(rgba: Palette.loadingColour)
//add the activity indicator as a subview of the alert controller's view
pending.view.addSubview(indicator)
indicator.isUserInteractionEnabled = false
// required otherwise if there buttons in the UIAlertController you will not be able to press them
indicator.startAnimating()
ViewController.present(pending, animated: true, completion: completionHandler)
}
Затем я использую эту функцию следующим образом:
displayActivityAlertWithCompletion("Pushing Data", ViewController: self){_ in
Helper_class.doSync(_cleanSync: false){
//sync is complete
Prefs.is_Syncing = false
DispatchQueue.main.async {
//dismiss my view with activity alert
self.dismiss(animated: true){
//dismiss my viewcontroller
Toast(text: "Upload sync completed").show()
self.dismiss(animated: true, completion: nil)
}
}
}
}
Будет ли это потенциальной причиной проблемы UIKit?
4 ответа
Выполните следующие действия, вы можете сделать это: 1. Откройте Navigator; 2. Переключитесь на BreakPoint Navigator; 3. Нажмите кнопку "+" в левом нижнем углу; 4. Когда появится всплывающее окно, нажмите "Exception BreakPoint".
Затем запустите ваш проект снова, он сломается в точном месте.
Ниже приведены мои предложения:
- Попробуйте повторить проблему самостоятельно. Поскольку вы знаете, на каком экране происходит сбой, вы можете легко определить контроллер / класс представления, вызвавший сбой. Это будет хорошим началом. Как только вы определили класс, проверьте
- Если происходит сбой во время загрузки экрана или выхода из экрана. Поместите точки останова на
UIViewController
функции -viewDidLoad
,viewWillAppear
,viewWillDisappear
и так далее. - Если происходит сбой в событии, таком как нажатие кнопки, изменение сегмента или перезагрузка таблицы.
- Если происходит сбой во время загрузки экрана или выхода из экрана. Поместите точки останова на
- Получите больше информации из отчета Crashlytics. Это всегда идет с именем файла, где произошел сбой. Я приложил скриншот Crashlytics, который показывает список сбоев вместе с именем файла.
- Обновите свой вопрос с более подробной информацией после выполнения вышеуказанного.
Согласно вашему коду, вы дважды отклоняете один и тот же viewController. Принимать в ожидании в качестве глобальной переменной. И отклонить это как:
pending.dismiss(animated: true, completion: nil)
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(0.1)) {
self.dismiss(animated: true, completion: nil) // This will be called after above time gap.
}
Я столкнулся с той же аварией. И я воспроизвел эту аварию в этом случае. Есть viewController был представлен. Сбой происходит, когда я использую этот viewController для представления другого viewController, в то время как этот viewController отклоняется с анимацией. Я думаю, что вы можете добавить некоторые условия, чтобы избежать этого дела, например, если viewContoller.isBeingDismissed
, Если isBeingDismissed
верно, используйте другие viewControllers для выполнения текущего действия.
У меня была проблема с аварией в UIPresentationController
конструктор, когда делает какую-то миграцию за год.
Для меня проблема была решена путем изменения presenting
в source
в UIViewControllerTransitioningDelegate
,
Подобно:
public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
return PresentationController(presentedViewController: presented, presenting: source)
}
Хотя это было воспроизводимо все время, так что, возможно, не та же проблема..