2017-12-17 27 views
0

textView에 NSMutableAttributedString을 추가하고 있는데, tappableString을 클릭하면 새 vc를 표시하려고합니다. vc가 제공되지 않고 있으며 내가 잘못 가고있는 곳을 파악할 수 없습니다.Swift iOS -NSMutableAttributedString ViewController가 표시되지 않습니까?

textView의 위임자를 설정하고 textView의 을 사용하고 URL의 절대 문자열이 NSLinkAttributeName's "doSomething"값과 일치하지만 VC가 나타나지 않는지 확인합니다.

어디에서 잘못 생각합니까?

class FirstController: UIViewController, UITextViewDelegate { 

    fileprivate let textView: UITextView = { 
     let textView = UITextView() 
     textView.translatesAutoresizingMaskIntoConstraints = false 
     textView.isEditable = false 
     textView.isSelectable = true 
     textView.textAlignment = .center 
     textView.isScrollEnabled = true 
     return textView 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     textView.delegate = self 

     configureTextView() 
    } 

    override func viewDidLayoutSubviews() { 
     textView.setContentOffset(.zero, animated: false) 
    } 

    func configureTextView(){ 

     //textView anchors are set 

     let firstPlainSent = "Read this first.\n" 
     let secondPlainSent = "Read this second.\n" 

     plainSentAttr = [NSFontAttributeName: UIFont(name: "Helvetica", size: 17)!, NSForegroundColorAttributeName: UIColor.black] 

     let firstSent = NSAttributedString(string: firstPlainSent, attributes: plainSentAttr) 
     let secondSent = NSAttributedString(string: secondPlainSent, attributes: plainSentAttr) 

     let mutableAttributedString = NSMutableAttributedString() 
     mutableAttributedString.append(firstSent) 
     mutableAttributedString.append(secondSent) 

     let tappableString = NSMutableAttributedString(string: "Click here to present the SecondVC\n\n") 
     tappableString.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica", size: 17)!, range: NSMakeRange(0, (tappableString.length))) 
     tappableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue, range: NSMakeRange(0, (tappableString.length))) 
     tappableString.addAttribute(NSUnderlineStyleAttributeName, value: 1, range: NSMakeRange(0,tappableString.length)) 
     tappableString.addAttribute(NSUnderlineColorAttributeName, value: UIColor.blue, range: NSMakeRange(0, tappableString.length)) 
     tappableString.addAttribute(NSLinkAttributeName, value: "doSomething", range: NSMakeRange(0, (tappableString.length))) 

     mutableAttributedString.append(tappableString) 

     textView.attributedText = mutableAttributedString 
    } 


    func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool { 

     // I also tried URL.scheme 
     if URL.absoluteString == "doSomething"{ 

      let secondVC = SecondController() 
      let navVC = UINavigationController(rootViewController: secondVC) 
      present(navVC, animated: true, completion: nil) 
      return false 
     } 

     return true 
    } 
} 
+0

새 프로젝트에 코드를 추가했는데 새로운 경우 VC가 나타납니다! 코드의 다른 부분에 문제가 있습니까? –

+0

@ AndréSlotta는 도움을 주셔서 감사합니다. 제가 틀린 것을 알 수있는 것은 없으며 텍스트보기와 텍스트를 볼 수 있기 때문에 앵커가 괜찮습니다. 그것은 당신이 아닌 나에게 맞지 않는 것이 이상한가? 다시 확인해 볼게. –

+0

@ AndréSlotta 문제는 이전 버전의 textView 메소드를 사용했기 때문입니다. 도와 주셔서 감사합니다! –

답변

0

문제는 내가 텍스트 뷰의 대리자 메서드의 이전 방법 서명 사용 하였다 : 나는 자동 완성을 사용하면

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool{ 

} 

을 새로운 메소드 서명은 모든 것이 잘 작동하는 것처럼 보였습니다.

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool { 

} 
0

난 당신이

여기의 스토리 보드 이름을 사용하여 뷰 컨트롤러를 인스턴스화하는 것을 잊지 생각 "메인은"스토리 보드 이름입니다.

let storyboard = UIStoryboard(name: "Main", bundle: nil) 

let secondVC = storyboard.instantiateViewController(withIdentifier: "SecondController") as! SecondController 

그래서 최종 코드는 같은 것,

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let secondVC = storyboard.instantiateViewController(withIdentifier: "SecondController") as! SecondController 

let navVC = UINavigationController(rootViewController: secondVC) 
present(navVC, animated: true, completion: nil) 
+0

감사하지만 프로그래밍 방식입니다. Storyboards를 사용하지 않고 있습니다. –

+0

btw 상수 이름으로 UIStoryboard를 사용하면 안됩니다. 소문자 여야하며 UI로 시작하지 않아야합니다. 이 같은 것이 더 적합합니다 : storyboard = UIStoryboard (name : "Main", 번들 : nil), secondVC = storyboard.instantiateViewController ... –

+0

예, 감사합니다. –