Дважды щелкните строку NSTableView в Cocoa?



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

466   7  

7 ответов:

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

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

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

  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...
}

надеюсь, что это помогает.

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

  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

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

@IBOutlet weak var searchResultTable: NSTableView!

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

func doubleClickOnResultRow()
{
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}

вы можете подключить действие двойного щелчка в Interface Builder. Управление-щелкните представление таблицы (убедитесь, что вы получаете таблица, а не вид прокрутки или вид клипа или столбец таблицы), чтобы получить его панель соединений. Найдите пункт "doubleAction" в разделе "отправленные действия". Подключите его к IBAction по вашему выбору.

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

-(IBAction)openWindow:(id)sender

in .M файл реализовать то же самое

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

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

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

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

затем выполните все настройки для нового окна на prepare for segue:

хорошо сначала на интерфейсе Строитель:

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
        }

Затем нам нужна функция для выполнения segue на двойном щелчке таблицы, эта функция вызывается с помощью селектора #и поэтому должна быть видна для 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)
}

Comments

    Ничего не найдено.