2017-04-13 31 views
6
benim denetleyicilerin

biri alt dize de özelliklerini alınıyor içinde bir bağlantı vardır bir NSAttributeString vardır:3 Swift: NSAttributedString

@IBOutlet var textView: UITextView! 

// Below is extracted from viewDidLoad() 
let linkStr = "Click <a href='http://google.com'>here</a> for good times." 
let attributedText = try! NSAttributedString(
    data: linkStr.data(using: String.Encoding.unicode, allowLossyConversion: true)!, 
    options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], 
    documentAttributes: nil) 
textView.attributedText = attributedText 

ben denetleyicisi için bir birim test yazıyorum ve bunu doğrulamak istediğiniz Doğru link "here" metnine konuldu. (Bağlantı aslında dinamik olarak üretilir, bu yüzden test etmek istiyorum).

let url = uviewController.textView.attributedText.attribute(
    "NSLink", at: 6, effectiveRange: nil) 
// url == A URL object for http://google.com. 

sorundur:

let text = viewController.textView.attributedText.string 
// text == "Click here for good times." 

Ben de böyle bir şey yaparak "burada" den bağlantı özelliğine alabilirsiniz:

Neyse, belli ki böyle ilişkilendirilmemiş metin alabilirsiniz at parametresi için "6" kodunu kodlamak zorunda kaldım. linkStr'un değeri gelecekte değişebilir ve testimi her zaman güncellemek zorunda kalmak istemiyorum. Bu durumda, bu kelimeye bağlı olan bağlantı ile her zaman "burada" kelimesine sahip olacağını varsayabiliriz.

yüzden yapmak istiyorum kelimesinin ne "burada" linkStr yılında olduğu için karakterini bulup NSLink niteliğini çekin ve sağa işaret doğrulamak amacıyla at parametresine bu değeri geçmesi olduğunu URL. Ama bunu yapmak için Swift'de string aralıklarını ve dizinleri nasıl kullanacağım konusunda kafaları veya kuyrukları yapmakta sorun yaşıyorum.

Herhangi bir öneriniz var mı?

cevap

5

Sabit kodlama yapmadan bunu nasıl yapabilirsiniz.

import UIKit 
import PlaygroundSupport 

let linkStr = "Click <a href='http://google.com'>here</a> for good times." 
let attributedText = try! NSAttributedString(
    data: linkStr.data(using: String.Encoding.unicode, allowLossyConversion: true)!, 
    options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], 
    documentAttributes: nil) 

attributedText.enumerateAttribute(NSLinkAttributeName , in: NSMakeRange(0, attributedText.length), options: [.longestEffectiveRangeNotRequired]) { value, range, isStop in 
    if let value = value { 
     print("\(value) found at \(range.location)") 
    } 
} 

print açıklamada çıkışları:

http://google.com/ found at 6 
+1

Vay ... tahmin etmezdi Bu örneğe bağlı olarak Swift 3 oyun alanı kodudur. Swift ... bazen ilginçtir. Teşekkürler! – Chad