Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

<Ол>
  • IBOutlet для NSTableView должен быть объявлен в интерфейсе. Я предположил, что это предпочтительно делать в делегате таблицы.
  • IBOutlet к таблице должен быть подключен через Interface Builder. Для этого Ctrl-Drag & amp; Загляните в 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...
    }
    

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

    Как сказал 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 » раскрытие информации, Это будет работать

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top