2009-03-06 4 views
62

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

ответ

117

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

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

+7

Есть ли способ подключения через IB? –

+21

Также не забудьте установить цель для представления таблицы с помощью setTarget :, глупо, но может быть упущено. – nduplessis

+1

Если вы реализуете -setDoubleAction: как метод делегата или должны создать iVar IBOutlet для таблицы и вызвать -setDoubleAction: на Ивар? –

55

Добавляем более основную информацию в ответ @JimPuls в интересах других новичков в Cocoa.

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

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

0

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

-(IBAction)openWindow:(id)sender 

в .m файл реализовать тот же

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

получил, что СИБ, где ваш табличное представление присутствует, выберите представление таблицы и получив вторую последнюю вкладку инспектора атрибутов, откройте двойное определение атрибута символа cicl, чтобы проверить владельца файла выбора лисицы, патч модели должен быть «self», имя селектора будет «openWindow: », тот же процесс делает с« Двойным щелчком мыши »раскрывается re, Это будет работать

10

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

  1. Выберите Table View в IB, то в Bindings инспектором, эти два привязок следующим образом:

    >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

+0

Работали как шарм. – groomsy

6

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

@IBOutlet weak var searchResultTable: NSTableView! 

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

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

Это действительно полезно. Для тех, кто хочет узнать больше о 'doubleAction', проверьте это [link] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableView_Class/index.html#//apple_ref/ОКК/instp/NSTableView/doubleAction). –

+0

Для Swift 3, селектором функций будет 'searchResultTable.doubleAction = #selector (doubleClickOnResultRow)' –

6

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

+0

Легкий спрей лимонный. Вы можете получить щелчок по строке из метода clickedRow в представлении таблицы. Вы все еще нуждаетесь в выходе, описанном в ответе номер два. –

+0

Вам не обязательно нужен выход, подключенный к представлению таблицы, поскольку представление таблицы выступает в качестве аргумента отправителя сообщения о действии. –

+0

Жаль, что я не видел этого, прежде чем копать в свой собственный распознаватель жестов ... – ghostatron

Смежные вопросы