2015-12-22 8 views
12

में क्लिक करने योग्य लिंक प्रदर्शित करने के लिए कैसे मैं क्लिक करने योग्य लिंक के साथ एक UITextview में एक विशेषता स्ट्रिंग प्रदर्शित करने का प्रयास कर रहा हूं। मैंने यह देखने के लिए एक सरल परीक्षण परियोजना बनाई है कि मैं कहां गलत हो रहा हूं और अभी भी इसे समझ नहीं सकता। मैंने उपयोगकर्ता इंटरैक्शन को सक्षम करने और shouldInteractWithURLs प्रतिनिधि विधि को सेट करने का प्रयास किया है, लेकिन यह अभी भी काम नहीं कर रहा है। यहाँ मेरी कोड (है कि केवल एक TextView शामिल एक दृश्य नियंत्रक के लिए)UITextView

@IBOutlet weak var textView: UITextView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let string = "Google" 
    let linkString = NSMutableAttributedString(string: string) 
    linkString.addAttribute(NSLinkAttributeName, value: NSURL(string: "https://www.google.com")!, range: NSMakeRange(0, string.characters.count)) 
    linkString.addAttribute(NSFontAttributeName, value: UIFont(name: "HelveticaNeue", size: 25.0)!, range: NSMakeRange(0, string.characters.count)) 
    textView.attributedText = linkString 
    textView.delegate = self 
    textView.selectable = true 
    textView.userInteractionEnabled = true 
} 

और यहाँ प्रतिनिधि तरीकों मैं क्रियान्वित किया है कर रहे हैं:

func textViewShouldBeginEditing(textView: UITextView) -> Bool { 
    return false 
} 

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

यह अभी भी काम नहीं कर रहा है। मैंने इस विषय पर खोज की है और अभी तक कुछ भी मदद नहीं मिली है। पहले से बहुत - बहुत धन्यवाद।

उत्तर

34

बस अपने स्टोरीबोर्ड में UITextView का चयन करें और "विशेषताएँ इंस्पेक्टर दिखाएं" पर जाएं और selectable और links चुनें। जैसा कि नीचे दी गई छवि दिखाती है। सुनिश्चित करें कि Editable अनचेक है।

enter image description here

+1

धन्यवाद। मैं वास्तव में पोस्टिंग के तुरंत बाद इसे बाहर निकाला (इस पर कई घंटे खर्च करने के बाद, आंकड़े जाओ)। मैंने पहले ही चयन करने योग्य और लिंक की जांच की थी, लेकिन मुझे इसे काम करने के लिए "संपादन योग्य" को अनचेक करने की आवश्यकता थी। – jhk727

+1

रशवान, क्या होगा यदि मैं टेक्स्ट व्यू को संपादन योग्य बनाना चाहता हूं, लेकिन जब भी टेक्स्ट व्यू पहले उत्तरदाता को इस्तीफा देता है, तो आईओएस नोट्स ऐप में स्वचालित लिंक डिटेक्शन भी चाहिए? क्या मै वह कर सकता हूं? – owlswipe

+0

क्या संपादन योग्य के साथ ऐसा करने का कोई तरीका है? –

1

स्विफ्ट 3 आईओएस 10: यहाँ क्लिक करने योग्य विस्तारित UITextView कि स्वचालित रूप से जब तक TextView अंदर वेबसाइटों का पता लगाने कड़ी के रूप में www के साथ शुरू है। उदाहरण के लिए: www.exmaple.com यदि यह पाठ में कहीं भी मौजूद है तो क्लिक करने योग्य होगा। यहां कक्षा है:

import Foundation 
import UIKit 




public class ClickableTextView:UITextView{ 



    var tap:UITapGestureRecognizer! 
    override public init(frame: CGRect, textContainer: NSTextContainer?) { 
     super.init(frame: frame, textContainer: textContainer) 
     print("init") 
     setup() 
    } 
    required public init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setup() 
    } 


    func setup(){ 

     // Add tap gesture recognizer to Text View 
     tap = UITapGestureRecognizer(target: self, action: #selector(self.myMethodToHandleTap(sender:))) 
     //  tap.delegate = self 
     self.addGestureRecognizer(tap) 
    } 

    func myMethodToHandleTap(sender: UITapGestureRecognizer){ 

     let myTextView = sender.view as! UITextView 
     let layoutManager = myTextView.layoutManager 

     // location of tap in myTextView coordinates and taking the inset into account 
     var location = sender.location(in: myTextView) 
     location.x -= myTextView.textContainerInset.left; 
     location.y -= myTextView.textContainerInset.top; 


     // character index at tap location 
     let characterIndex = layoutManager.characterIndex(for: location, in: myTextView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil) 

     // if index is valid then do something. 
     if characterIndex < myTextView.textStorage.length { 

      let orgString = myTextView.attributedText.string 


      //Find the WWW 
      var didFind = false 
      var count:Int = characterIndex 
      while(count > 2 && didFind == false){ 

       let myRange = NSRange(location: count-1, length: 2) 
       let substring = (orgString as NSString).substring(with: myRange) 

//    print(substring,count) 

       if substring == " w" || (substring == "w." && count == 3){ 
        didFind = true 
//     print("Did find",count) 

        var count2 = count 
        while(count2 < orgString.characters.count){ 

         let myRange = NSRange(location: count2 - 1, length: 2) 
         let substring = (orgString as NSString).substring(with: myRange) 

//      print("Did 2",count2,substring) 
         count2 += 1 


         //If it was at the end of textView 
         if count2 == orgString.characters.count { 

          let length = orgString.characters.count - count 
          let myRange = NSRange(location: count, length: length) 

          let substring = (orgString as NSString).substring(with: myRange) 

          openLink(link: substring) 
          print("It's a Link",substring) 
          return 
         } 

         //If it's in the middle 

         if substring.hasSuffix(" "){ 

          let length = count2 - count 
          let myRange = NSRange(location: count, length: length) 

          let substring = (orgString as NSString).substring(with: myRange) 

          openLink(link: substring) 
          print("It's a Link",substring) 

          return 
         } 

        } 

        return 
       } 


       if substring.hasPrefix(" "){ 

        print("Not a link") 
        return 
       } 

       count -= 1 

      } 


     } 


    } 


    func openLink(link:String){ 

     if let checkURL = URL(string: "http://\(link.replacingOccurrences(of: " ", with: ""))") { 
      if UIApplication.shared.canOpenURL(checkURL) { 
       UIApplication.shared.open(checkURL, options: [:], completionHandler: nil) 

       print("url successfully opened") 
      } 
     } else { 
      print("invalid url") 
     } 
    } 


    public override func didMoveToWindow() { 
     if self.window == nil{ 
      self.removeGestureRecognizer(tap) 
      print("ClickableTextView View removed from") 
     } 
    } 
} 
+0

'% 20' से बचने वाले वर्णों के साथ व्हाइटस्पेस वर्णों को प्रतिस्थापित करना बेहतर नहीं होगा? – royalmurder