Hyperlinks in einem view-based NSTableView

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hyperlinks in einem view-based NSTableView

    Hi,

    so, da habe ich nun mein zweites Anfängerproblem, für das ich erstmal keine Lösung finde.

    Ich bastel gerade an einer Mac-App mit einem NSTableView. Der NSTableView ist view-based, also arbeite ich mit der Klasse NSTableCellView. Die Klasse gibt es erst seit 10.7, daher habe ich zu diesem Thema bisher auch kaum etwas gefunden. Grundsätzlich funktioniert soweit alles wie gedacht. Mein einziges Problem stellen Hyperlinks im NSTextField des NSTableCellViews da. Ich habe es bis jetzt leider nicht geschafft, einen Link klickbar zu machen, sodass sich dieser im Browser öffnet. Die Wege, die ich bis jetzt so aufgetan habe, waren alle für Cell-Based Tableviews geeignet, z.B. Apples Cocoa Tips and Tricks Session von der WWDC 2010 (Sample Code ). Da wurde eine Custom NSTextFieldCell vorgeschlagen. Das habe ich umgesetzt, leider wird die Methode

    Quellcode

    1. - (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:(NSView *)controlView untilMouseUp:(BOOL)flag
    in meiner Version nicht aufgerufen. Wie gesagt, die Lösung scheint nur mit Cell-Based TableViews zu funktionieren, besser gesagt, ich habe es einfach noch nicht hingekriegt...

    Ich würde sonst auch einfach auf einen Cell-Based-Style wechseln, leider ist der View-Based Style für meinen Anwendungszweck genau das richtige und ich kann mir schwer vorstellen, dass es nicht möglich ist, klickbare Links anzuzeigen.


    Vielleicht hat ja jemand von euch eine Lösung bzw. einen guten Ansatz den ich ausprobieren könnte.
  • Hm, alles viel zu kompliziert. Einfach einen NSAttributedString nehmen und das NSTextField entsprechend setzen:

    snippets.aktagon.com/snippets/…e-a-NSTextField-and-Cocoa

    Quellcode

    1. @implementation NSAttributedString (TVLAttributedStringAdditions)
    2. + (NSAttributedString *)attributedStringWithLinkToURL:(NSURL *)aURL title:(NSString *)title {
    3. NSMutableAttributedString *attrString = [[[NSMutableAttributedString alloc] initWithString:title] autorelease];
    4. NSRange range = NSMakeRange(0, [attrString length]);
    5. [attrString beginEditing];
    6. [attrString addAttribute:NSLinkAttributeName value:aURL range:range];
    7. // make the text appear in blue
    8. [attrString addAttribute:NSForegroundColorAttributeName value:[NSColor blueColor] range:range];
    9. // next make the text appear with an underline
    10. [attrString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSSingleUnderlineStyle] range:range];
    11. // allow truncation
    12. NSMutableParagraphStyle *ps = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    13. [ps setLineBreakMode:NSLineBreakByTruncatingTail];
    14. [attrString addAttribute:NSParagraphStyleAttributeName value:ps range:range];
    15. [ps release];
    16. [attrString endEditing];
    17. return attrString;
    18. }
    19. @end
    20. // dann im Code
    21. NSURL *url = [ NSURL URLWithString:@"http://developer.apple.com/" ];
    22. [self.linkTextField setAllowsEditingTextAttributes: YES];
    23. [self.linkTextField setSelectable: YES];
    24. [ self.linkTextField setAttributedStringValue:[ NSAttributedString attributedStringWithLinkToURL:url title:@"http://developer.apple.com/" ] ];
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Markus Müller ()

  • sauerzapf schrieb:

    Ich habe es auch mit einem cellbased TableView gelöst.
    Cellbased oder View-Based? Wie gesagt, ich probiere es mit einem View-Based. Beim Cell-Based hat es bei mir auch schon geklappt. Beim view-based eben leider nicht...

    Hier mal ein Auszug aus meinem tableview datasource:

    Quellcode

    1. - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { MZCellView *result = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
    2. MZObj *mzObj = [self.objs objectAtIndex:row];
    3. [result.textField.cell setAllowsEditingTextAttributes: YES];
    4. [result.textField.cell setSelectable: YES];
    5. [result.textField.cell setAttributedStringValue:mzObj.outputText];
    6. if ([result.textField.cell isKindOfClass:[MZLinkTextFieldCell class]]) { MZLinkTextFieldCell *linkCell = (MZLinkTextFieldCell *)result.textField.cell;
    7. // Setup the work to be done when a link is clicked NSLog(@"xxxxxxxx"); linkCell.linkClickedHandler = ^(NSURL *url, id sender) { [[NSWorkspace sharedWorkspace] openURL:url]; }; }
    8. return result;
    9. }



    das "xxxxxxxx" wird sauber ausgegeben. Also passt soweit alles. Textausgabe ist auch sauber, Farben und die Unterstriche werden sauber angezeigt. Aber der Klick wird leider nicht in der MZLinkTextFieldCell registriert...
    Im Anhang habe ich mal meine MZLinkTextFieldCell hochgeladen. Sie entspricht dem Sample Code der WWDC 2010 Session: Cocoa Tips and Tricks.

    Dort habe ich nur als Anhaltspunkt, dass

    Quellcode

    1. - (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:(NSView *)controlView untilMouseUp:(BOOL)flag


    nicht aufgerufen wird...

    Quellcode

    1. - (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView


    ist in der MZLinkTextFieldCell auch überschrieben. Wird auch aufgerufen aber die trackMouse wie gesagt leider nicht...

    Irgendetwas ganz simples werde ich wohl übersehen...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Mceee ()

  • Du brauchst die custom-cell nicht, das geht mit einem ganz stinknormalen NSTextField. Du darfst die Settings auch nicht an der cell sondern am View setzen:

    Quellcode

    1. - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { MZCellView *result = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
    2. MZObj *mzObj = [self.objs objectAtIndex:row];
    3. [result.textField setAllowsEditingTextAttributes: YES];
    4. [result.textField setSelectable: YES];
    5. [result.textField setAttributedStringValue:mzObj.outputText];
    6. // jetzt evtl. noch target und action setzen (falls nicht im IB geschehen) und gut ist
    7. [result.textField setTarget:... ];
    8. [result.textField setAction:@selector(...)];
    9. return result;
    10. }