Дважды щелкните строку NSTableView в Какао? - PullRequest
68 голосов
/ 07 марта 2009

Мне нужно, чтобы мое приложение открывало окно, когда пользователь дважды щелкает строку в NSTableView. Мне трудно найти информацию или примеры того, как этого добиться. Кто-нибудь может указать мне правильное направление?

Ответы [ 7 ]

127 голосов
/ 07 марта 2009

Взгляните на метод -setDoubleAction: в NSTableView; Вы можете установить это для метода, который будет вызываться так же, как обычная система целевого действия, но по двойному щелчку.

В этом методе действия будет полезно -clickedRow.

54 голосов
/ 05 декабря 2011

Добавление дополнительной базовой информации к ответу @JimPuls для пользы других новичков в Какао.

  1. IBOutlet для NSTableView должен быть объявлен в интерфейсе. Я предположил, что это предпочтительно делать в делегате таблицы.
  2. IBOutlet к таблице должен быть подключен через Interface Builder. Для этого Ctrl-Drag & Drop в IB из класса, который объявляет выход в табличное представление. Когда вы отпустите кнопку мыши, появится всплывающее окно с названием розетки, которую вы объявили на шаге 1. Выберите это.
  3. В разделе @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...
}

Надеюсь, это поможет.

10 голосов
/ 25 марта 2014

Как сказал PR Сингх, вы можете использовать привязки какао, вы также можете передавать выбранные объекты.

  1. Выберите табличное представление в 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

7 голосов
/ 22 сентября 2015

Если кто-то ищет версию Swift 2.0: Это то, что работает для меня. Кажется, намного проще, чем код Objective C.

@IBOutlet weak var searchResultTable: NSTableView!

override func viewDidLoad() {
    super.viewDidLoad()
    searchResultTable.doubleAction = "doubleClickOnResultRow"
}

func doubleClickOnResultRow()
{
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}
6 голосов
/ 11 ноября 2015

Вы можете подключить действие двойного щелчка в Интерфейсном Разработчике. Удерживая клавишу Control, щелкните представление таблицы (убедитесь, что вы получаете представление таблицы , а не представление прокрутки, или представление клипа, или столбец таблицы), чтобы открыть панель соединений. Найдите пункт «doubleAction» в разделе «Отправленные действия». Подключите его к IBAction на ваш выбор.

1 голос
/ 06 апреля 2018

на SWIFT 4.1 Вы устанавливаете метод doubleAction объекта TableView внутри вашего кода для выполнения функции @objc с помощью #selector (nameOfYourFunction)

Внутри этой функции вы вызываете segue. Вы можете связать ваше новое окно с исходным окном в InterfaceBuilder (не с объектом NSTableView, а с самим объектом ViewController.

Затем выполните все настройки для нового окна при подготовке к переходу:

Хорошо, сначала в Интерфейсном Разработчике:

enter image description here

Конечно, укажите идентификатор для этого сеанса:

enter image description here

Далее, внутри нашего первого контроллера вида (где находится табличное представление) код:

 //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)
}
0 голосов
/ 23 сентября 2013

Вы можете сделать то же самое с привязками, в первую очередь объявив один mentod в файле .h

-(IBAction)openWindow:(id)sender

в .m файле реализуют то же самое

-(IBAction)openWindow:(id)sender
{
    //do something here;
}

добрался до того пера, где присутствует ваше табличное представление, выберите табличное представление и получил вторую последнюю вкладку инспектора атрибутов, откройте двойную проверку треугольника раскрытия аргумента cicl и проверьте привязку лисы, выберите владельца файла, ключ модели должен быть "self" ", имя селектора будет" openWindow: ", то же самое будет делать с раскрытием" цели двойного щелчка ", Это будет работать

...