5

В моем приложении iOS есть пара errors. Я не могу понять эту конкретную ошибку в Core Foundation, которая затрагивает несколько пользователей в моем приложении. Поток не ломается ни в одном из моих файлов проекта, и я не уверен, что вызывает этот крах.Непризнанный селектор отправлен в экземпляр _UIAlertControllerAlertPresentationController

Прикрепление журналов аварийной сигнализации. Любые советы или помощь будут очень полезны, спасибо.

CoreFoundation _CF_forwarding_prep_0

Неустранимое исключение: NSInvalidArgumentException - [_ UIAlertControllerAlertPresentationController adaptivePresentationController]: непризнанные селектор направлен например 0x133e29870

Fatal Exception: NSInvalidArgumentException 
0 CoreFoundation     0x18ff391b8 __exceptionPreprocess 
1 libobjc.A.dylib    0x18e97055c objc_exception_throw 
2 CoreFoundation     0x18ff40268 __methodDescriptionForSelector 
3 CoreFoundation     0x18ff3d270 ___forwarding___ 
4 CoreFoundation     0x18fe3680c _CF_forwarding_prep_0 
5 UIKit       0x19689708c -[UISearchController _searchPresentationController] 
6 UIKit       0x19648f8cc -[_UISearchControllerTransplantSearchBarAnimator animateTransition:] 
7 UIKit       0x19613d464 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke 
8 UIKit       0x19607ffdc _runAfterCACommitDeferredBlocks 
9 UIKit       0x196071d50 _cleanUpAfterCAFlushAndRunDeferredBlocks 
10 UIKit       0x195de10b4 _afterCACommitHandler 
11 CoreFoundation     0x18fee60c0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ 
12 CoreFoundation     0x18fee3cf0 __CFRunLoopDoObservers 
13 CoreFoundation     0x18fee4180 __CFRunLoopRun 
14 CoreFoundation     0x18fe122b8 CFRunLoopRunSpecific 
15 GraphicsServices    0x1918c6198 GSEventRunModal 
16 UIKit       0x195e597fc -[UIApplication _run] 
17 UIKit       0x195e54534 UIApplicationMain 
18 Levo       0x1000c1c30 main (AppDelegate.swift:22) 
19 libdispatch.dylib    0x18edf55b8 (Missing) 
func showErrorView(errorType: ErrorType, retryClickDelegate: ErrorViewRetryClickDelegate?) { 
    var message = "" 
    switch errorType { 
    case .INTERNET: 
     message = "Your internet connection does not seem to be working. Kindly ensure that you are connected to the internet and try again" 
     break 
    case .INVALID_DATA: 
     message = "Something went wrong. Please try again!" 
     break 
    case .JSON_PARSING: 
     message = "Something went wrong. Please try again!" 
     break 
    case .UNAUTHORIZED: 
     self.showInformativeAlert("Logged Out", message: "Looks like you have been logged out. Please login in again!", completion: nil) 
     self.switchStoryboard(Storyboard.SIGNIN) 
     return 
    default: 
     message = "Something went wrong. Please try again!" 
    } 

    let errorAlert = UIAlertController(title: "Error", message: message, preferredStyle: .Alert) 
    if let retryClickDelegate = retryClickDelegate { 
     errorAlert.addAction(UIAlertAction(title: "Try again", style: UIAlertActionStyle.Default, handler: { (action) in 
      retryClickDelegate.onErrorRetryClicked(errorType) 
      errorAlert.dismissViewControllerAnimated(true, completion: nil) 
     })) 
    } 
    errorAlert.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default, handler: nil)) 

    if (isTopViewController) { 
     self.presentViewController(errorAlert, animated: true, completion: nil) 
    } 
} 

func showInformativeAlert(title: String?, message: String?,completion : (() -> Void)?) { 
    let informativeAlert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) 
    informativeAlert.addAction(UIAlertAction(title: "Got it!", style: UIAlertActionStyle.Default, handler: { (action) in 
     informativeAlert.dismissViewControllerAnimated(true, completion: nil) 
     completion?() 
    })) 
    self.presentViewController(informativeAlert, animated: true, completion: nil) 
} 

public var isTopViewController: Bool { 
    if self.navigationController != nil { 
     return self.navigationController?.visibleViewController === self 
    } else if self.tabBarController != nil { 
     return self.tabBarController?.selectedViewController == self && self.presentedViewController == nil 
    } else { 
     return self.presentedViewController == nil && self.isVisible 
    } 
} 
+0

вы можете показать ваш код попробовал –

+0

Возможный дубликат http://stackoverflow.com/questions/36834755/cancelling-search-with-uisearchcontroller-causes-crash – Sulthan

+0

@ Anbu.Karthik - Я не уверен, где аварии происходит, отредактировал сообщение с возможным просмотренным кодом. У меня эти ErrorViews добавлены в расширение UIViewController. – Muthu

ответ

0

Я думаю, что проблема заключается в том, что вы не используете обработчики завершения правильно, поэтому в то же время появляется одно предупреждение и исчезает. Например, вместо:

informativeAlert.dismissViewControllerAnimated(true, completion: nil) 
    completion?() 

Вы должны использовать

informativeAlert.dismissViewControllerAnimated(true, completion: completion) 

Кроме того, реализация isTopViewController может не легко, если вид контроллера анимации в процессе.

Например, если вы звоните по номеру showErrorView, то isTopViewController будет, возможно, true для обоих вызовов, а два предупреждения начнут появляться сразу, сбой вашего приложения.

 Смежные вопросы

  • Нет связанных вопросов^_^