I'm facing a weird bug in my iOS app, and it only happens in device. In my app I've a home page, from there if user presses a button I'll show a FormSheet (About Us page).
let storyBoard = UIStoryboard(name: "Utility", bundle: nil);
let aboutUsVC = storyBoard.instantiateViewControllerWithIdentifier("AboutUs") as! AboutUsViewController;
aboutUsVC.modalPresentationStyle = .FormSheet;
aboutUsVC.preferredContentSize = CGSize(width: 500,height: 400);
self.presentViewController(aboutUsVC, animated: true, completion: nil);
I've placed a UITextView inside that about us page and added a link as it's content:
When I long press on that link I'm getting a warning message on my console:
<_UIRotatingAlertController: 0x13e107200> on which is already presenting
After the long press if I click on the link again, the app crashes with following message:
2016-03-16 18:11:37.022 MyApp[938:400786] *** Assertion failure in -[UITextView startInteractionWithLinkAtPoint:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.29.5/UITextView_LinkInteraction.m:377
2016-03-16 18:11:37.023 MyApp[938:400786] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '' *** First throw call stack: (0x184220f48 0x198e47f80 0x184220e18 0x185114a1c 0x18a12de50 0x189d38be4 0x189d2f330 0x189958b5c 0x1897e685c 0x189d3070c 0x1897a58b8 0x1897a263c 0x1841d7bd0 0x1841d5974 0x1841d5da4 0x184104ca0 0x18f184088 0x18981cffc 0x100188368 0x19968a8b8) libc++abi.dylib: terminating with uncaught exception of type NSException
I think the UIKit is causing that crash. How can I fix this crash ?
As mentioned in this Apple Forum post, I implemented the following UITextViewDelegate
and it solved my issue
func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool
{
UIApplication.sharedApplication().openURL(URL)
return false
}
@Louis Tur: Thanks for the link
Swift 5.2
@available(iOS 10.0, *)
func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
{
UIApplication.shared.openURL(url)
return false
}
@available(iOS, deprecated: 10.0)
func textView(_ textView: UITextView, shouldInteractWith url: URL, in characterRange: NSRange) -> Bool
{
UIApplication.shared.openURL(url)
return false
}
My fix for the crash was to implement both the deprecated and its replacement delegate methods.
/// Gets called if iOS version is >= 10.
@available(iOS 10.0, *)
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
return textViewShouldInteractWithURL(URL: URL)
}
/// deprecated delegate method. Gets called if iOS version is < 10.
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
return textViewShouldInteractWithURL(URL: URL)
}
func textViewShouldInteractWithURL(URL: URL) -> Bool {
// common logic here
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With