在UITextView上按下链接时应用程序崩溃

时间:2016-03-16 13:50:26

标签: ios swift uitextview

我在我的iOS应用中遇到了一个奇怪的错误,它只发生在设备中。在我的应用程序中,我有一个主页,如果用户按下按钮,我将显示一个FormSheet(关于我们页面)。

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);

我已将UITextView放在关于我们页面的内容中,并添加了链接,因为它的内容如下: Link in Text View

第1期

当我长按该链接时,我在控制台上收到警告信息:

  

< _UIRotatingAlertController:0x13e107200>已经提出的   

第2期

长按后如果再次点击该链接,该应用程序会崩溃并显示以下消息:

  

2016-03-16 18:11:37.022 MyApp [938:400786] ***断言失败    - [UITextView startInteractionWithLinkAtPoint:],/ BuildRoot / Library / People / com.apple.xbs / Source / UIKit / UIKit-3512.29.5 / UITextView_LinkInteraction.m:377

     

2016-03-16 18:11:37.023 MyApp [938:400786] ***终止app到期   未被发现的异常' NSInternalInconsistencyException',原因:''   ***首先抛出调用堆栈:(0x184220f48 0x198e47f80 0x184220e18 0x185114a1c 0x18a12de50 0x189d38be4 0x189d2f330 0x189958b5c   0x1897e685c 0x189d3070c 0x1897a58b8 0x1897a263c 0x1841d7bd0   0x1841d5974 0x1841d5da4 0x184104ca0 0x18f184088 0x18981cffc   0x100188368 0x19968a8b8)libc ++ abi.dylib:以未捕获终止   NSException类型的异常

我认为UIKit造成了这次崩溃。我该如何修复此崩溃?

更多信息:

  1. Base SDK:9.2
  2. 部署目标:8.1
  3. Xcode版本:7.2.1
  4. iOS设备操作系统版本:9.1

4 个答案:

答案 0 :(得分:6)

正如本Apple Forum post所述,我实施了以下UITextViewDelegate并解决了我的问题

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool
{
    UIApplication.sharedApplication().openURL(URL)
    return false  
}  

@Louis Tur:感谢您的链接

答案 1 :(得分:2)

我对崩溃的解决方法是实现已弃用和替换的委托方法。

/// 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
}

答案 2 :(得分:1)

我们在PSPDFKit中也看到了这个问题,在调查了UIKit程序集和WKWebView来源之后,我们发现了一个仍然很糟糕但不具有侵入性的解决方法。

主要策略是选择性并及时应用解决方法 - 然后再次清理。你可以在这里阅读源代码:

https://gist.github.com/steipete/b00fc02aa9f1c66c11d0f996b1ba1265

请尽快rdar://26295020这样就可以及时解决iOS 10的问题。(该漏洞自iOS 8开始存在,并首次在iOS 8b5上报告。)

这可能是比改变URL与其交互方式的行为更好的解决方案。

答案 3 :(得分:1)

I faced this problem when used incorrect URL format in my links. I wanted to present a new controller on screen upon tapping a link and implemented a custom URL scheme to support it. When doing so, I mistakenly wrote the scheme in format scheme:\\ instead of scheme:// and caught the crash.