Сбой 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".

Затем запустите ваш проект снова, он сломается в точном месте.

Ниже приведены мои предложения:

  1. Попробуйте повторить проблему самостоятельно. Поскольку вы знаете, на каком экране происходит сбой, вы можете легко определить контроллер / класс представления, вызвавший сбой. Это будет хорошим началом. Как только вы определили класс, проверьте
    • Если происходит сбой во время загрузки экрана или выхода из экрана. Поместите точки останова на UIViewController функции - viewDidLoad, viewWillAppear, viewWillDisappear и так далее.
    • Если происходит сбой в событии, таком как нажатие кнопки, изменение сегмента или перезагрузка таблицы.
  2. Получите больше информации из отчета Crashlytics. Это всегда идет с именем файла, где произошел сбой. Я приложил скриншот Crashlytics, который показывает список сбоев вместе с именем файла.
  3. Обновите свой вопрос с более подробной информацией после выполнения вышеуказанного.

Согласно вашему коду, вы дважды отклоняете один и тот же 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)
}

Хотя это было воспроизводимо все время, так что, возможно, не та же проблема..

Другие вопросы по тегам