2015-03-24 2 views
0

У меня есть программа, которая имеет NSTableView, заполненную загружаемыми файлами. После отправки файла текстовая ячейка с именем файла получает гиперссылку, помещенную в нее (данным массива присваивается NSMutableString с атрибутом NSLinkAttributeName). Как разрешить пользователям нажимать эту ссылку, чтобы открыть веб-страницу в браузере по умолчанию?Создайте и ответьте на гиперссылку в текстовой ячейке NSTableView

ответ

2

После долгих поисков и попыток использования нескольких методов это то, с чем я столкнулся в качестве решения.

Создание пользовательского класса, который расширяет NSTableViewCell:

class TableViewCellCursor: NSTableCellView { 

internal var active = false 

//MARK: - View Life Cycle 

override func awakeFromNib() { 
    superview?.awakeFromNib() 
    self.createTrackingArea() 
} 

//MARK: - IBActions 

override func mouseEntered(theEvent: NSEvent) { 
    if (NSCursor.currentCursor() == NSCursor.arrowCursor() && active) { 
     NSCursor.pointingHandCursor().set() 
    } 
} 

override func mouseExited(theEvent: NSEvent) { 
    if (NSCursor.currentCursor() == NSCursor.pointingHandCursor() && active) { 
     NSCursor.arrowCursor().set() 
    } 
} 

//Informs the receiver that the mouse cursor has moved into a cursor rectangle. 
override func cursorUpdate(event: NSEvent) { 
    if (active) { 
     NSCursor.pointingHandCursor().set() 
    } 
} 

//MARK: - Util 

func createTrackingArea() { 
    var focusTrackingAreaOptions:NSTrackingAreaOptions = NSTrackingAreaOptions.ActiveInActiveApp 
    focusTrackingAreaOptions |= NSTrackingAreaOptions.MouseEnteredAndExited 
    focusTrackingAreaOptions |= NSTrackingAreaOptions.AssumeInside 
    focusTrackingAreaOptions |= NSTrackingAreaOptions.InVisibleRect 

    var focusTrackingArea:NSTrackingArea = NSTrackingArea(rect: NSZeroRect, 
                 options: focusTrackingAreaOptions, 
                 owner: self, userInfo: nil) 
    self.addTrackingArea(focusTrackingArea) 
} 
} 

Проверка состояния первого ответчика при изменении выбора NSTableView. Это необходимо потому, что выбор стола может быть изменен, даже если это не firstResponder:

func tableViewSelectionDidChange(aNotification: NSNotification) { 
    if (self.firstResponder == filesToTransferTable) { 
     changeSelectedRowTextColorTo(NSColor.whiteColor(), unselectedColor: NSColor.blueColor()) 
    } else { 
     changeSelectedRowTextColorTo(NSColor.blackColor(), unselectedColor: NSColor.blueColor()) 
    } 
} 

func changeSelectedRowTextColorTo(selectedColor: NSColor, unselectedColor: NSColor) { 
    let selectedRows = filesToTransferTable.selectedRowIndexes 
    for (index, tableEntry) in enumerate (tableData) { 
     if tableData[index]["FileName"] is NSMutableAttributedString { 
      var name = tableData[index]["FileName"] as! NSMutableAttributedString 
      var range = NSMakeRange(0, NSString(string:name.string).length) 
      name.beginEditing() 
      name.removeAttribute(NSForegroundColorAttributeName, range: range) 

      if (selectedRows.containsIndex(index)) { 
       name.addAttribute(NSForegroundColorAttributeName, value:selectedColor, range:range) 
      } else { 
       name.addAttribute(NSForegroundColorAttributeName, value:unselectedColor, range:range) 
      } 

      name.endEditing() 
      tableData[index]["FileName"] = name 
     } 
     filesToTransferTable.reloadDataForRowIndexes(NSIndexSet(index: index), columnIndexes: NSIndexSet(index:0)) 
    } 
} 

Добавление КВО для проверки, когда FirstResponder изменения:

//This is somewhere in your code where you initialize things 
//KVO for first responder behavior regarding tableView and updating attributedStrings' colors 
self.addObserver(self, forKeyPath: "firstResponder", options: NSKeyValueObservingOptions.Old | NSKeyValueObservingOptions.New, context: nil) 

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
      if (change[NSKeyValueChangeNewKey] is NSTableView) { 
       changeSelectedRowTextColorTo(NSColor.whiteColor(), unselectedColor: NSColor.blueColor()) 
      } else if (change[NSKeyValueChangeOldKey] is NSTableView) { 
       changeSelectedRowTextColorTo(NSColor.blackColor(), unselectedColor: NSColor.blueColor()) 
      } 
     } 

Наконец, проверка, если главное окно (приложение само) находится в фокусе (если это не будет сделано, то цвета не изменится соответствующим образом, когда окно теряет фокус):

//Put these in the same place as the KVO code 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "windowDidBecomeKey:", 
        name: NSWindowDidBecomeKeyNotification , object: self) 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "windowDidResignKey:", 
        name: NSWindowDidResignKeyNotification , object: self) 


    func windowDidBecomeKey(notification: NSNotification) { 
     if (self.firstResponder == filesToTransferTable) { 
      changeSelectedRowTextColorTo(NSColor.whiteColor(), unselectedColor: NSColor.blueColor()) 
     } else { 
      changeSelectedRowTextColorTo(NSColor.blackColor(), unselectedColor: NSColor.blueColor()) 
     } 
    } 

    func windowDidResignKey(notification: NSNotification) { 
     if (self.firstResponder == filesToTransferTable) { 
      changeSelectedRowTextColorTo(NSColor.blackColor(), unselectedColor: NSColor.blueColor()) 
     } 
    } 
0

Текстовые поля автоматически поддерживают щелчок по встроенным ссылкам, но только в том случае, если они, по крайней мере, могут быть выбраны (если не редактируются). Таким образом, вы можете выбрать текстовое поле.

+0

К сожалению, клетки NSTableView являются текстовыми ячейками, а не текст представления. Я установил текстовую ячейку с гиперссылкой на «selectable», но я все еще не могу нажать ссылку, чтобы открыть ее. Должен ли я использовать другой тип ячейки, чем текстовую ячейку? Благодаря! –

+0

Является ли текстовая ячейка настроенной для разрешения расширенного текста? Для этого также необходимо использовать приписанный текст. –

+0

Да, ячейка настроена так, чтобы разрешать расширенный текст, выбирается, и для действия установлено значение «Отправить только для входа». На данный момент я использую таблицу TableViewSelectionDidChange для NSTable, но это больше похоже на взломать, чем на то, что мне нравится. –

Смежные вопросы