我正在创建一个应该显示字符串列表的应用程序,该字符串是从服务器返回的,可以是html,也可以不是。 我目前正在UILabel中设置文本。这样做我使用下面的
NSMutableAttributedString *attributedTitleString = [[NSMutableAttributedString alloc] initWithData:[title dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
cell.label.attributedText =attributedTitleString;
当文本是html时,由于字体和对齐在html中返回,所以一切都很完美。当文本是普通文本时,会出现此问题。字体,文本对齐,文本大小等不再受到尊重。
那么如何检查文本是否为html字符串? 在正常文本的情况下,我将使用以下内容:
cell.label.text =title;
我曾尝试在论坛上搜索,但仍然没有得到任何答案。
答案 0 :(得分:2)
这很好,你需要把:
cell.label. attributedText = title;
也包括普通文本。
因为工作正常。运行以下代码。
//如果是HTML文字
NSString *htmlstr = `@"This is <font color='red'>simple</font>"`;
NSMutableAttributedString *attributedTitleString = [[NSMutableAttributedString alloc] initWithData:[htmlstr dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
textField.attributedText =attributedTitleString;
textField.font = [UIFont fontWithName:@"vardana" size:20.0];
//如果是普通文字。
NSString *normalStr = @"This is Renuka";
NSMutableAttributedString *NorAttributedTitleString = [[NSMutableAttributedString alloc] initWithData:[normalStr dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
textField.attributedText = NorAttributedTitleString;
textField.font = [UIFont fontWithName:@"vardana" size:20.0];
答案 1 :(得分:1)
您可以检查您的字符串是否包含html标记:
// iOS8 +
NSString *string = @"<TAG>bla bla bla html</TAG>";
if ([string containsString:@"<TAG"]) {
NSLog(@"html string");
} else {
NSLog(@"no html string");
}
// iOS7 +
NSString *string = @"<TAG>bla bla bla html</TAG>";
if ([string rangeOfString:@"<TAG"].location != NSNotFound) {
NSLog(@"html string");
} else {
NSLog(@"no html string");
}
答案 2 :(得分:0)
由于HTML和XML的语法和结构非常相似,因此可以使用XMLDocument
来检查给定的数据对象是HTML还是纯文本。
因此,数据来自Data
类型,并由URLSession
dataTask返回。
// Default to plain text
var options : [NSAttributedString.DocumentReadingOptionKey: Any] = [.documentType: NSAttributedString.DocumentType.plain]
// This will succeed for HTML, but not for plain text
if let _ = try? XMLDocument(data: data, options: []) {
options[.documentType] = NSAttributedString.DocumentType.html
}
guard let string = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else { return }
更新
以上方法适用于种。我遇到一些HTML无法创建XML文档的麻烦。目前,我有一个非常不喜欢的解决方案。 因为症状是属性字符串中只返回一行,所以只需检查一下,如果只有一行,则创建一个新的属性字符串。
var options : [NSAttributedString.DocumentReadingOptionKey: Any] = [.documentType: NSAttributedString.DocumentType.html]
guard var string = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else { return }
if string.string.split(separator: "\n").count == 1 {
options[.documentType] = NSAttributedString.DocumentType.plain
guard let tempString = try? NSAttributedString(data: data, options: options, documentAttributes: nil) else { return }
string = tempString
}