如何在NSTableView中创建可点击的网址

时间:2015-07-05 10:25:42

标签: objective-c nstableview

我正在尝试构建基于OS-X核心数据的应用程序。在其中一个实体中,我存储了一个URL ex。 (www.somesite.com/somepage/someindex.php)

使用绑定,我在nvm中成功显示了网址。不过,我希望该网址可以点击,点击后,浏览器会启动并打开该页面。我做了一些研究,我找到了一些解决方案,例如:

Clickable url link in NSTextFieldCell inside NSTableView?

也:

https://developer.apple.com/library/mac/qa/qa1487/_index.html

但它们看起来都过时了,第一个是六岁,而第二个是2005年1月最后一次更新

任何人都可以提供更轻松的更快的方法如何实现这一目标?我没想到我必须编写大量代码才能使简单的链接工作才能说实话......我来自Web开发世界,那些东西可以用几秒钟来整理出来,虽然这里的故事似乎完全不同......

任何帮助将不胜感激。

约翰

2 个答案:

答案 0 :(得分:3)

您可以使用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;
}

答案 1 :(得分:2)

您可以在tableviewcell中使用TTTAttributedLabel。它支持强大的链路检测。