在实际使用过程中,NSTextField需要能够显示超链接,用户点击之后可以跳转自动打开浏览器并显示相应的网页。
基于此需求,实现过程如下:
Step1 服务器支持
如果数据是从服务器获取,则文字部分一般为HTML格式并需要使用base64编码之后提供给客户端。
Step2 属性设置
先提供方法如下:
-(NSAttributedString *)stringFromHTML:(NSString *)html withFont:(NSFont *)font
{
if (!font) font = [NSFont systemFontOfSize:0.0]; // Default font
html = [NSString stringWithFormat:@"<span style=\"font-family:'%@'; font-size:%dpx;\">%@</span>", [font fontName], (int)[font pointSize], html];
NSData *data = [html dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *options = NSDictionary *options = @{NSTextEncodingNameDocumentOption: @"UTF-8"};
NSAttributedString* string = [[NSAttributedString alloc] initWithHTML:data options:options documentAttributes:nil];
return string;
}
使用方式:
// @property IBOutlet NSTextField *tf;
[tf setAllowsEditingTextAttributes: YES];
[tf setSelectable:YES];
NSString *credits = @"Visit our <a href=\"http://www.baidu.com\">open baidu</a>";
[tf setAttributedStringValue:[self stringFromHTML:credits withFont:[tf font]]];
通过上述方法,NSTextField可显示并响应用户点击操作,并且在鼠标移入区域后光标也会变为点击状态。
注意
上述方法中NSDictionary *options若不定义,可能会存在显示乱码的问题。
参考文献
1.https://stackoverflow.com/questions/15956698/nsattributedstring-initwithhtml-incorrect-character-encoding
2.https://stackoverflow.com/questions/2570368/trying-to-create-link-with-nstextfield