Дважды щелкните строку NSTableView в Какао?
-
05-07-2019 - |
Вопрос
Мне нужно, чтобы мое приложение открывало окно, когда пользователь дважды щелкает строку в NSTableView
. Мне трудно найти информацию или примеры того, как этого добиться. Кто-нибудь может указать мне правильное направление?
Решение
Посмотрите на -setDoubleAction:
в NSTableView; Вы можете установить это для метода, который будет вызываться так же, как обычная система целевого действия, но по двойному щелчку.
В этом методе действия -clickedRow
будет полезен.
Другие советы
Добавление более базовой информации в ответ @JimPuls для пользы других новичков в Какао.
<Ол>Вот выдержка из моего делегата по просмотру таблиц. Мой делегат также настроен как источник данных, поэтому вы увидите интерфейсы NSTableViewDelegate и NSTabeViewDataSource, связанные с ним.
// Интерфейсная выдержка.
@interface MyTableViewDelegate : NSObject <NSTableViewDelegate, NSTableViewDataSource>
{
// This iVar needs to be connected to the table view via the IB.
IBOutlet NSTableView *tableOutlet;
}
@property (assign) IBOutlet NSTableView *tableOutlet;
- (void)doubleClick:(id)nid;
@end
// Отрывок реализации.
@implementation MyTableViewDelegate
@synthesize tableOutlet = _tableOutlet;
- (void)awakeFromNib {
[_tableOutlet setTarget:self];
[_tableOutlet setDoubleAction:@selector(doubleClick:)];
}
- (void)doubleClick:(id)object {
// This gets called after following steps 1-3.
NSInteger rowNumber = [_tableOutlet clickedRow];
// Do something...
}
Надеюсь, это поможет.
Как сказал PR Сингх, вы можете использовать привязки какао, вы также можете передавать выбранные объекты.
<Ол>Выберите табличное представление в IB, затем в инспекторе привязок установите эти две привязки следующим образом:
>Double Click Target
bind to = Application delegate object (or file owner)
model key path = self
selector name = myMethod:
>Double Click Argument
bind to = array controller
controller key = selectedObjects
selector name = myMethod:
Где myMethod реализован как
- (void)myMethod:(NSArray*)selectedObjects
{
NSLog(@"%@", selectedObjects);
}
Это также задокументировано здесь: https://developer.apple.com/library/mac/qa/ qa1472 / _index.html р>
Если кто-то ищет версию Swift 2.0: Это то, что работает для меня. Кажется, намного проще, чем код Objective C. Р>
@IBOutlet weak var searchResultTable: NSTableView!
override func viewDidLoad() {
super.viewDidLoad()
searchResultTable.doubleAction = "doubleClickOnResultRow"
}
func doubleClickOnResultRow()
{
print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}
Вы можете подключить действие двойного щелчка в Интерфейсном Разработчике. Удерживая нажатой клавишу «Control», щелкните представление таблицы (убедитесь, что вы получаете представление таблицы , а не представление прокрутки, или представление клипа, или столбец таблицы), чтобы открыть панель соединений. Найдите & # 8220; doubleAction & # 8221; пункт в & # 8220; Отправленные действия & # 8221; раздел. Подключите его к IBAction на ваш выбор.
На SWIFT 4.1 Вы устанавливаете метод doubleAction объекта TableView внутри вашего кода для выполнения функции @objc с помощью #selector (nameOfYourFunction)
Внутри этой функции вы вызываете segue. Вы можете связать ваше новое окно с исходным окном в InterfaceBuilder (не с объектом NSTableView, а с самим объектом ViewController.
Затем выполните все настройки для нового окна при подготовке к переходу:
Хорошо, сначала в Интерфейсном Разработчике:
Конечно, дайте идентификатор этой теме:
Затем, внутри нашего первого контроллера представления (где табличное представление), код:
//We use this function: prepare for segue
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
// check if we are referring to the actual segue we want
if segue.identifier?.rawValue == "segueToYourNewWindow" {
// now create a reference to that new window
let yourNewWindow = segue.destinationController as! newWindowViewController
// now change variables inside that view controller code, remember that the objects might fail if they are not yet visible to the user so first set up the variables or call them using the main thread, up to your design.
yourNewWindow.selectedRowVariable = thisTableView.clickedRow
}
Затем нам нужна функция для выполнения перехода по двойному щелчку табличного представления, эта функция вызывается с помощью #selector и, следовательно, должна быть видимой для Objective C (даже если мы программируем в Swift), мы просто запускаем функция с @Objc вот и все.
@objc func doubleClickOnResultRow() {
//beware of double-clicking also triggers this function when no rows is selected with the selectedRow being -1
if (thisTableView.selectedRow > -1 ) {
performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "segueToYourNewWindow"), sender: nil)
}
}
Наконец, мы устанавливаем эту функцию для метода doubleAction TableView в части начальной настройки нашего кода следующим образом:
override func viewDidLoad() {
super.viewDidLoad()
thisTableView.doubleAction = #selector(doubleClickOnResultRow)
}
Вы можете сделать то же самое с привязками, в первую очередь объявив один mentod в файле .h
-(IBAction)openWindow:(id)sender
в файле .m реализует то же самое
-(IBAction)openWindow:(id)sender
{
//do something here;
}
добрался до того кончика, где присутствует ваше табличное представление, выберите табличное представление и получил вторую последнюю вкладку инспектора атрибутов, откройте двойную проверку треугольника раскрытия аргумента cicl и проверьте привязку лисы к файлу владельца файла, патч ключа модели должен быть " self », имя селектора будет« openWindow: », то же самое будет и с« Double click target » раскрытие информации, Это будет работать