Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unrecognized selector sent to instance _UIAlertControllerAlertPresentationController

There are couple of errors in real-time scenarios on my iOS application. I'm unable to understand this particular error on Core Foundation which is affecting multiple users in my application. The flow is not breaking in any of my project files and I'm not sure what is causing this crash.

Attaching the crashlytics logs. Any advice or help would be of great help, thanx.

CoreFoundation _CF_forwarding_prep_0

Fatal Exception: NSInvalidArgumentException -[_UIAlertControllerAlertPresentationController adaptivePresentationController]: unrecognized selector sent to instance 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
    }
}
like image 693
Muthu Avatar asked Jan 25 '17 08:01

Muthu


People also ask

What does unrecognized selector sent to instance mean?

I'm probably getting the terminology wrong, but “unrecognized selector” means you're asking an Objective-C object or class to run a function that it doesn't implement. (


1 Answers

I think the problem is that you are not using the completion handlers correctly, therefore at the same time there is one alert appearing and disappearing. For example, instead of:

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

You should use

    informativeAlert.dismissViewControllerAnimated(true, completion: completion)

Also, the implementation of isTopViewController can fail easily if a view controller animation is in process.

For example, if you call showErrorView twice, isTopViewController will be probably true for both calls and two alerts will start appearing at once, crashing your app.

like image 105
Sulthan Avatar answered Oct 13 '22 00:10

Sulthan