Мне нужно, чтобы мое приложение открывало окно, когда пользователь дважды щелкает по строке в NSTableView
. Мне сложно найти информацию или примеры того, как это сделать. Может ли кто-нибудь указать мне в правильном направлении?
Дважды щелкните строку NSTableView в Cocoa?
Ответ 1
Взгляните на метод -setDoubleAction:
на NSTableView; вы можете установить это на метод, который будет вызываться так же, как и обычная система целевого действия, но при двойном щелчке.
В этом методе действий полезно -clickedRow
.
Ответ 2
Добавление дополнительной информации в ответ @JimPuls для других новичков в Cocoa.
- IBOutlet для NSTableView должен быть объявлен в интерфейсе. Я предположил, что это предпочтительнее делать в делегате таблицы.
- IBOutlet к таблице необходимо подключить через Interface Builder. Для этого перетащите Ctrl и перетащите в IB из класса, объявляющего выход в виде таблицы. Когда вы отпускаете мышь, всплывающее окно должно появиться с именем розетки, которую вы указали на шаге # 1. Выберите это.
- В разделе @implementation в методе -awakeFromNib вызовите -setTarget: и -setDoubleAction: на IBOutlet, объявленном на шаге # 1, и подключен к шагу # 2.
Здесь выдержка из моей таблицы. У меня есть мой делегат, который также настроен как источник данных, поэтому вы увидите связанные с ним интерфейсы 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...
}
Надеюсь, что это поможет.
Ответ 3
Как сказал PR Сингх, вы можете использовать привязки cocoa, вы также можете передавать выбранные объекты.
Выберите свое представление таблицы в 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
Ответ 4
Если кто-то ищет быструю версию 2.0: Это то, что работает для меня. Это намного проще, чем код Objective C.
@IBOutlet weak var searchResultTable: NSTableView!
override func viewDidLoad() {
super.viewDidLoad()
searchResultTable.doubleAction = "doubleClickOnResultRow"
}
func doubleClickOnResultRow()
{
print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}
Ответ 5
Вы можете подключить действие двойного щелчка в Interface Builder. Щелкните правой кнопкой мыши на вашем представлении таблицы (убедитесь, что вы получаете представление таблицы, а не прокрутку или просмотр клипа или столбец таблицы), чтобы получить панель своих подключений. Найдите пункт "DoubleAction" в разделе "Отправленные действия". Подключите его к IBAction по вашему выбору.
Ответ 6
Вы можете сделать то же самое с привязками, в первую очередь объявив один метод в файле .h
-(IBAction)openWindow:(id)sender
в файле .m реализовать то же самое
-(IBAction)openWindow:(id)sender
{
//do something here;
}
добрался до того пера, где присутствует ваше табличное представление, выберите табличное представление и получил вторую последнюю вкладку инспектора атрибутов (привязок), откройте double click argument
треangularьник раскрытия, отметьте привязку, чтобы установить флажок, выберите владельца файла, путь ключа модели должен быть "self", имя селектора будет "openWindow:", тот же процесс, что и с раскрытием "Double click target",
Это будет работать
Ответ 7
На 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)
}