如何在 NSTableView 中制作可点击的 url
how can I make clickable url in NSTableView
我正在尝试构建 OS-X 基于核心数据的应用程序。在其中一个实体中,我存储了一个 URL ex。 (www.somesite.com/somepage/someindex.php)
使用绑定,我在 NSTableView
中成功显示了 URL。但是,我希望 URL 可以点击,点击后,浏览器会启动并打开页面。我做了一些研究,并且找到了一些解决方案,例如:
Clickable url link in NSTextFieldCell inside NSTableView?
还有:
https://developer.apple.com/library/mac/qa/qa1487/_index.html
但它们看起来都过时了,第一个已经六岁了,而第二个最后更新于 2005 年 1 月
任何人都可以提供更简单快捷的方法来实现这个目标吗?老实说,我没想到我将不得不编写一堆代码来使简单的 link 工作......我来自网络开发世界,在那里这些事情可以用很少的东西来解决秒,而这里似乎是完全不同的故事....
任何帮助将不胜感激。
约翰
您可以在 tableviewcell 中使用 TTTAttributedLabel。它支持强大的link检测。
您可以使用 NSTextView
并实现它的委托。有演示:
// MyCellView.h
@interface MyCellView : NSView
@property (nonatomic, strong) IBOutlet NSTextView *textView;
@end
// ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.delegate = self;
self.tableView.dataSource = self;
NSNib *nib = [[NSNib alloc] initWithNibNamed:@"MyCellView" bundle:[NSBundle mainBundle]];
[self.tableView registerNib:nib forIdentifier:@"MyCell"];
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
MyCellView *cell = (MyCellView *)[tableView makeViewWithIdentifier:@"MyCell" owner:self];
cell.textView.delegate = self;
[cell.textView.textStorage setAttributedString:[self makeLinkAttributedString:@"This is a test: www.somesite.com/somepage/someindex.php"]];
return cell;
}
- (NSAttributedString *)makeLinkAttributedString:(NSString *)string {
NSMutableAttributedString *linkedString = [[NSMutableAttributedString alloc] initWithString:string];
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
[detector enumerateMatchesInString:string options:0 range:NSMakeRange(0, string.length) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) {
if (match.URL) {
NSDictionary *attributes = @{ NSLinkAttributeName: match.URL };
[linkedString addAttributes:attributes range:match.range];
}
}];
return [linkedString copy];
}
#pragma mark - NSTextViewDelegate methods
- (BOOL)textView:(NSTextView *)textView clickedOnLink:(id)link atIndex:(NSUInteger)charIndex {
// The click will be handled by you or the next responder.
return NO;
}
我正在尝试构建 OS-X 基于核心数据的应用程序。在其中一个实体中,我存储了一个 URL ex。 (www.somesite.com/somepage/someindex.php)
使用绑定,我在 NSTableView
中成功显示了 URL。但是,我希望 URL 可以点击,点击后,浏览器会启动并打开页面。我做了一些研究,并且找到了一些解决方案,例如:
Clickable url link in NSTextFieldCell inside NSTableView?
还有:
https://developer.apple.com/library/mac/qa/qa1487/_index.html
但它们看起来都过时了,第一个已经六岁了,而第二个最后更新于 2005 年 1 月
任何人都可以提供更简单快捷的方法来实现这个目标吗?老实说,我没想到我将不得不编写一堆代码来使简单的 link 工作......我来自网络开发世界,在那里这些事情可以用很少的东西来解决秒,而这里似乎是完全不同的故事....
任何帮助将不胜感激。
约翰
您可以在 tableviewcell 中使用 TTTAttributedLabel。它支持强大的link检测。
您可以使用 NSTextView
并实现它的委托。有演示:
// MyCellView.h
@interface MyCellView : NSView
@property (nonatomic, strong) IBOutlet NSTextView *textView;
@end
// ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.delegate = self;
self.tableView.dataSource = self;
NSNib *nib = [[NSNib alloc] initWithNibNamed:@"MyCellView" bundle:[NSBundle mainBundle]];
[self.tableView registerNib:nib forIdentifier:@"MyCell"];
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
MyCellView *cell = (MyCellView *)[tableView makeViewWithIdentifier:@"MyCell" owner:self];
cell.textView.delegate = self;
[cell.textView.textStorage setAttributedString:[self makeLinkAttributedString:@"This is a test: www.somesite.com/somepage/someindex.php"]];
return cell;
}
- (NSAttributedString *)makeLinkAttributedString:(NSString *)string {
NSMutableAttributedString *linkedString = [[NSMutableAttributedString alloc] initWithString:string];
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
[detector enumerateMatchesInString:string options:0 range:NSMakeRange(0, string.length) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) {
if (match.URL) {
NSDictionary *attributes = @{ NSLinkAttributeName: match.URL };
[linkedString addAttributes:attributes range:match.range];
}
}];
return [linkedString copy];
}
#pragma mark - NSTextViewDelegate methods
- (BOOL)textView:(NSTextView *)textView clickedOnLink:(id)link atIndex:(NSUInteger)charIndex {
// The click will be handled by you or the next responder.
return NO;
}