У меня есть программа, которая имеет NSTableView, заполненную загружаемыми файлами. После отправки файла текстовая ячейка с именем файла получает гиперссылку, помещенную в нее (данным массива присваивается NSMutableString с атрибутом NSLinkAttributeName). Как разрешить пользователям нажимать эту ссылку, чтобы открыть веб-страницу в браузере по умолчанию?Создайте и ответьте на гиперссылку в текстовой ячейке NSTableView
ответ
После долгих поисков и попыток использования нескольких методов это то, с чем я столкнулся в качестве решения.
Создание пользовательского класса, который расширяет 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())
}
}
Текстовые поля автоматически поддерживают щелчок по встроенным ссылкам, но только в том случае, если они, по крайней мере, могут быть выбраны (если не редактируются). Таким образом, вы можете выбрать текстовое поле.
- 1. Создать гиперссылку на лист в ячейке VBA
- 2. Создать гиперссылку в ячейке Excel?
- 3. Изменение данных в выбранной ячейке в NSTableView
- 4. NSTableView дисплей изображения в одной ячейке
- 5. Как сделать заголовок в ячейке столбца NSTAbleView?
- 6. Преобразование текстовой ссылки в гиперссылку и текст привязки
- 7. Показать значок и текст в одной ячейке NSTableView
- 8. Создайте две строки в NSTableView в какао
- 9. Добавление текстовой ссылки на гиперссылку по электронной почте
- 10. Добавление на основе текстовой строки в ячейке в таблице
- 11. Как создать гиперссылку на другую сцену из текстовой области
- 12. Создайте гиперссылку (гиперссылку) перед раскрывающимся списком с jQuery
- 13. Создайте гиперссылку из текстового файла в C#
- 14. Новая строка в текстовой ячейке SQLite
- 15. Ответьте на 2 абзаца
- 16. Создайте много данных и загрузите в NSTableView в реальном времени
- 17. Фильтрация сводной таблицы на основе текстовой строки в ячейке
- 18. Ответьте на FETCH_HEAD
- 19. Ответьте на Intent.ACTION_BATTERY_CHANGED
- 20. OpenCL Ответьте на буфере
- 21. Слушайте и ответьте ANR?
- 22. Создайте гиперссылку на файл проекта на консольном выходе
- 23. Создайте гиперссылку на наклонное изображение в выражении Blend
- 24. Создайте собственный цвет шрифта и гиперссылку в UITextView
- 25. Вставить гиперссылку и удалить гиперссылку в Javascript
- 26. Создайте файл cookie в текстовой области onkeypress и отправьте его
- 27. NSTableView и проверка данных?
- 28. Ответьте на несколько событий KeyDown
- 29. Создайте гиперссылку, которая имеет структуру веб-страницы
- 30. Facebook ответьте на понравившуюся кнопку
К сожалению, клетки NSTableView являются текстовыми ячейками, а не текст представления. Я установил текстовую ячейку с гиперссылкой на «selectable», но я все еще не могу нажать ссылку, чтобы открыть ее. Должен ли я использовать другой тип ячейки, чем текстовую ячейку? Благодаря! –
Является ли текстовая ячейка настроенной для разрешения расширенного текста? Для этого также необходимо использовать приписанный текст. –
Да, ячейка настроена так, чтобы разрешать расширенный текст, выбирается, и для действия установлено значение «Отправить только для входа». На данный момент я использую таблицу TableViewSelectionDidChange для NSTable, но это больше похоже на взломать, чем на то, что мне нравится. –