Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
1.5k kez görüntülendi
ios development kategorisinde tarafından
Selam arkadaşlar gece saat üç ve ben beni uyutmayan bir soru ile karşı karşıyayım.

Hali hazırda bir web sitem var bu site ağırlıklı olarak metin içerikli, ama içerde başka sitelerin linkleride kendi sitem içinde başka içeriklerin linkleride var.

Benim yapmak istediğim uygulamada  bu içerikleri listelediğim sırada göstericeğim içerik metinleri içindeki, başka sitelerin adreslerini normal bir link haline getirmek, kendi siteme ait linkleri ise uygulama içinde ilgili methodu çağırcak hale getirmek. Ve bir metin bloğu içinde birden fazla linkte olabiliyor.

Yaptığım araştırmalarda, swift ile textview veya label içeriğindeki poziyonunu belirlediğim bir kelimeye özellikler atayabileceğimi bunlardan birininde link olduğunu öğrendim. Ama kendi siteme ait zaten uygulamada var olan bir içeriğin linkini nasıl tanımlamam gerekir bunu anlayamadım bir label içindeki kelimeye poziyonunu belirleyip bir action atamam mümkün mü ? yoksa buryada normal browser için bir schame url verip deeplink olarak mı kullanmam gerekir ? Böyle yaparsam sizce uygulamada bir dezavantaj oluşturumu ? Benim aklıma hep belirlediğim kelimeye butonmuş gibi bir action atamk geldi ama bunun için bir yol bulamadım.

Yardımlarınız için çok teşekkür ederim.

1 cevap

+1 oy
tarafından
tarafından seçilmiş
 
En İyi Cevap

UITextView özelliklerinden biri olan "dataDetectorTypes"'ı "UIDataDetectorTypes.Link" olarak set etiiğinizde url patternine uygun tüm textler bir link'e dönüştürülür. mesela bunu kullanabilirsiniz. mevcut link'e tıklandığında farklı bir adrese mi yönlendirilmesini istiyorsunuz kulalnıcının? tam anlayamadım.

tarafından
şöyle tıkladığı link hali hazırda sitem içinde bir konuysa mesela uygulamam içinde, bir karşılığı olduğundan atıyorum ilgili konunun içeriğini listeliyen view ımı çağıracağım. Konu içinde haberturk.com unda linki olaiblir bunu ise bir web view içinde açacağım.
Uygulamada karşılığı olamayan linkleri web view de açma ihtimalini çözebiliyorum.

Fakat hali hazırda uygulamam içinde karşılığı olan bir veriyi  ilgili linke tıklandığında nasıl tetiklerim onu anlamaya çalışıyorum.

şöyle bir örnek veriyim.

aradığınız bu ..... sorunun cevabanı burda bulamasınız.   @pc_sorunları  başlığına bakınız.
@pc_sorunları  başlığına tıkladığında uygulama içinde bir method çağırmak istiyorum.
fakat bir yolunu bulmadım.
tarafından
+1
o zaman textView delegate metodlarından biri olan shouldInteractWithURL kullanılarak aşağıdaki örnekte verdiğim gibi birşeyler yapabilirsiniz mesela.





import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myString:String = "asdasdasd asd asdasd asda sdasdasd asdasd asdasd www.asd.com asdasd asdasd www.sdf.com"
        
        let mainAttributedString:NSMutableAttributedString = NSMutableAttributedString()
        let textFont:UIFont = UIFont(name: "Avenir-Heavy", size: 20)!
        let textParagraphStyle:NSMutableParagraphStyle = NSMutableParagraphStyle()
        textParagraphStyle.alignment = NSTextAlignment.Center
        let textAttributeDict = [NSFontAttributeName:textFont, NSForegroundColorAttributeName:UIColor.blackColor(), NSParagraphStyleAttributeName:textParagraphStyle]
        let textAttributedString:NSMutableAttributedString = NSMutableAttributedString(string: myString, attributes: textAttributeDict)
        mainAttributedString.appendAttributedString(textAttributedString)
        let hyperTextAttributeDict = [NSFontAttributeName:textFont, NSForegroundColorAttributeName:UIColor.redColor(), NSParagraphStyleAttributeName:textParagraphStyle]
        var textView = UITextView(frame: self.view.frame)
        textView.delegate = self
        textView.linkTextAttributes = hyperTextAttributeDict
        textView.dataDetectorTypes = UIDataDetectorTypes.Link
        textView.backgroundColor = UIColor.clearColor()
        textView.font = textFont
        textView.textColor = UIColor.blackColor()
        textView.textAlignment = NSTextAlignment.Justified
        textView.editable = false
        textView.userInteractionEnabled = true
        textView.selectable = true
        textView.scrollEnabled = true
        textView.scrollsToTop = true
        textView.attributedText = mainAttributedString
        self.view.addSubview(textView)
    }
    

    
    func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
        let textViewString:NSString = textView.text as NSString
        let rangedString:String = textViewString.substringWithRange(characterRange)
            if rangedString == "www.sdf.com" {
                println("do something else")
                return false
            }
        return true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
tarafından
Öncelikle ilgilendiğiniz için çok teşekkür ederim. Fakat test etme imkanım olmadığı için tam olarak anlayamadım, yukarıdaki işlem ilgili text i bir url çevirip ilgili kelimeye tıklayınca  println("do something else") yazdıran blok u mu çalıştırır ben burdan isteidğim başka bir methodu mu çağırmalıyım, eğer vaktiniz varsa açıklayabilirseniz, inanın bana çok yardımcı olacaksınız.
tarafından
+1
yukarıdaki örnek'de myString değişkenine tanımladığımız string içerisinde "www.asd.com" ve "www.sdf.com" olarak iki adet web adresi görüyorsunuz.
Bu string'i daha sonra bir UITextView'in içerisine atıyoruz ve UITextView'i delegate olarak set ediyoruz.
UITextView'in textView.dataDetectorTypes = UIDataDetectorTypes.Link olarak set ediyoruz.
daha sonra
 func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool
metoduyla UITExtView içerisindeki url pattern'ine uygun "www.asd.com" ve "www.sdf.com" alan adlarına tıklandığında yapılacak işlemlerin neler olduğunu belirliyoruz.
shouldInteractWithURL metodu textView içerisinde herhangi bir url pattern'ine uygun text'lere tıklandığında textView'in tamamını, tıklanan text'in range değerini veriyor.
bu sayede substringWithRange özelliğiyle textView içerisinde görüntülenmekte olan tüm text içerisindeki o an tıklanan url'nin range değerini kullanarak substringWithRange metoduyla tıklanan text'in ne olduğunu belirliyoruz.
eğer tıklanan text  "www.sdf.com" ise metodun return değerini false olarak döndürüyoruz.
değilse metod true döndürüyor ve ilgili link'i görüntülemek için safariyi açıyor.
false döndüğünde ise printout ettiğimiz yerde "println("do something else")" siz uygulama içerisinde açılmasını istediğiniz sayfa veya işleme ait metodu koyacaksınız.

boş bir proje açarak yukarıdaki kodun tamamını kopyalayıp projenin viewController'indaki kodlarla değiştirirseniz, nasıl çalıştığını çok daha iyi kavrayabilirsiniz. :)
tarafından
Samimi  söylüyorum bir çok insanın yapmayacağı şekilde bize çok kez yardımcı oldunuz. İlginiz için çok teşekkür ederim.
tarafından
+1
Rica ederim. Ne demek. Yardımcı olabiliyorsam ne mutlu bana. :)
tarafından
Helal olsun üstadım. Sen bizim her şeyimizsin :)
...