5

Istnieje kilka errors w scenariuszach w czasie rzeczywistym na mojej aplikacji iOS. Nie mogę zrozumieć tego konkretnego błędu pod numerem Core Foundation, który ma wpływ na wielu użytkowników w mojej aplikacji. Przepływ nie łamie się w żadnym z plików projektu i nie jestem pewien, co powoduje tę awarię.Nierozpoznany selektor wysłany do instancji _UIAlertControllerAlertPresentationController

Dołączanie logów crashlytics. Każda rada lub pomoc bardzo by pomogły, thanx.

CoreFoundation _CF_forwarding_prep_0

krytyczny Wyjątek NSInvalidArgumentException - [_ UIAlertControllerAlertPresentationController adaptivePresentationController] Przełącznik nierozpoznane wysyłane do przykładu 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

można pokazać swoją próbował kod –

+0

Możliwa duplikat http://stackoverflow.com/questions/36834755/cancelling-search-with-uisearchcontroller-causes-crash – Sulthan

+0

@ Anbu.Karthik - Nie jestem pewien, gdzie katastrofa dzieje się, zredagowałeś post z możliwym wypróbowanym kodem. Mam te ErrorViews dodane do mojego rozszerzenia UIViewController. – Muthu

Odpowiedz

0

Myślę, że problem polega na tym, że nie używasz poprawnie procedur obsługi ukończeń, dlatego jednocześnie pojawia się i znika jeden alert. Na przykład, zamiast:

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

Należy użyć

informativeAlert.dismissViewControllerAnimated(true, completion: completion) 

Również realizacja isTopViewController może nie łatwo, jeśli animacja widok kontroler jest w toku.

Na przykład, jeśli dwa razy zadzwonisz pod numer showErrorView, dla obu połączeń isTopViewController będzie prawdopodobnie true, a dwa powiadomienia zaczną się pojawiać od razu, powodując awarię aplikacji.