私はiOS開発に非常に慣れていないので、現在、ある種のJSONデータを受信するアプリに取り組んでいます。しかし、一部のバックエンドエキスパートは、Wordから直接情報をコピーして情報システムに貼り付けるだけの方がユーザーにとって良いと考えました。だから私はここに座って、UITableViewでクリック可能なリンクを作成しようとしています。
Webからのデータを解析して、次の形式の文字列を取得します。
Für mehr Informationen klicken sie <a href="http://www.samplelink.com/subpage.php?id=8">here</a>.
私はすでにUILabelを試してみましたが、いくつかの調査の後、今では頻繁に提案されるUITextViewを使用しています。属性インスペクターで、それを属性テキストとして設定し、リンク検出を有効にしました。これでテキストが赤く表示され、クリック可能になります。
私にとっての問題は、HTMLタグと正しい(ドイツ語)文字セットがまだ欠けていることです。正しい方法で表示する方法がわかりません。
表示された文字列は次のように解析されます:
func showHTMLString(unformattedString: String) -> NSAttributedString{
var attrStr = NSAttributedString(
data: tmpString.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil,
error: nil)
return attrStr!
}
TextviewにattrStr?.string
を入力すると、フォーマットは正しい方法で表示されますが、リンクも失われます。
表示された文字列を正しい方法でフォーマットする方法の提案はありますか?
事前に感謝しますAR4G4
問題は、HTMLを適切にロードするために、文字エンコーディングオプションをNSUnicodeStringEncodingからNSUTF8StringEncodingに変更する必要があることです。文字列拡張の読み取り専用計算プロパティを作成して、htmlコードを属性付き文字列に変換する必要があると思います。
Xcode 8.3.1•Swift 3.1
extension Data {
var attributedString: NSAttributedString? {
do {
return try NSAttributedString(data: self, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
} catch {
print(error)
}
return nil
}
}
extension String {
var data: Data {
return Data(utf8)
}
}
let htmlStringCode = "Für mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>"
htmlStringCode.data.attributedString?.string ?? "" // "Für mehr Informationen klicken sie here"
あなたの場合
yourTextView.attributedText = htmlStringCode.data.attributedString
IBでUITextViewの属性を確認します。リンクを機能させるには、Selectable
をオンにする必要があります。
HTMLをUIWebView
で表示することをお勧めします。 UITextView
を使用するよりも堅牢です。詳細については、 itextviewでHTMLテキストを表示 を参照してください。
Swift 4:のコードを使用しました
var descriptionStr : String = String() //Dynamic text
let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.caseInsensitive])
let range = NSRange(location: 0, length: descriptionStr.count)
let htmlLessString: String = regex.stringByReplacingMatches(in: descriptionStr, options: NSRegularExpression.MatchingOptions(), range:range, withTemplate: "")
textViewRef.text = htmlLessString
ブラウザーからhtml形式のテキストを貼り付け、それを文字列(html形式を含む)としてデータベースに保存し、次にデータベースから取得して表示できるようにするUITextViewを備えたアプリがありました。 Webサイトから最初にコピーされたときと同じ形式です。これを管理するには、次の2つの拡張を行います。
extension String
{
func getAttributedStringFromHTMLString() -> NSAttributedString
{
do {
let attributedString = try NSAttributedString(data: self.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil)
return attributedString
} catch {
print(error)
return NSAttributedString()
}
}
}
extension NSAttributedString
{
func getHTMLString() -> String
{
var htmlText = "";
let documentAttributes = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
do {
let htmlData = try self.dataFromRange(NSMakeRange(0, self.length), documentAttributes:documentAttributes)
if let htmlString = String(data:htmlData, encoding:NSUTF8StringEncoding) {
htmlText = htmlString
}
return htmlText
}
catch {
print("error creating HTML from Attributed String")
return ""
}
}
}
あなたのバージョンは最初からかなり近いです。 Leonardo Savio Dabusが述べたように、おそらくNSUTF * StringEncodingを試すべきです。以下は、期待される出力を生成します。彼が言ったように、これを頻繁に行う場合は、それを文字列の拡張子に追加することをお勧めします。
let theString = "Für mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>."
let theAttributedString = NSAttributedString(data: str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil, error: nil)
theTextView.attributedText = atString
私がこれを行うために使用した別の方法:
var someHtmlString = "Für mehr Informationen klicken sie <a href=\"http://www.samplelink.com/subpage.php?id=8\">here</a>."
let regex = try! NSRegularExpression(pattern: "<.*?>", options: [.CaseInsensitive])
let range = NSRange(location: 0, length: someHtmlString.characters.count)
let htmlLessString: String = regex.stringByReplacingMatchesInString(someHtmlString, options: NSMatchingOptions(), range:range, withTemplate: "")
最終結果-> htmlLessStringは
"Für mehr Informationen klicken sie here."
属性付き文字列を作成したら、attributedText
のUITextView
プロパティを、その属性付き文字列のNSAttributedString
プロパティではなくstring
自体に設定します。