web-dev-qa-db-ja.com

CocoaでNSTableView行をダブルクリックしますか?

ユーザーがNSTableViewの行をダブルクリックすると、ウィンドウを開くためのアプリケーションが必要です。これを達成する方法に関する情報や例を見つけるのに少し苦労しています。誰かが私を正しい方向に向けることができますか?

69
Allyn

-setDoubleAction: NSTableViewのメソッド。通常のターゲットアクションシステムと同様に、ダブルクリックで呼び出されるメソッドに設定できます。

そのアクションメソッドでは、 -clickedRow が便利です。

129
Jim Puls

Cocoaの他の新人の利益のために、@ JimPulsの回答にさらに基本的な情報を追加します。

  1. NSTableViewへのIBOutletは、インターフェイスで宣言する必要があります。私は、テーブルのデリゲートでそうすることが好ましいと思いました。
  2. テーブルへのIBOutletは、Interface Builderを介して接続する必要があります。これを行うには、テーブルビューへのアウトレットを宣言するクラスからIBでCtrlキーを押しながらドラッグアンドドロップします。マウスを離すと、ステップ1で宣言したアウトレットの名前を示すポップアップが表示されます。それを選択してください。
  3. @implementationセクションの-awakeFromNibメソッドで、ステップ#1で宣言され、ステップ#2で接続されたIBOutletで-setTarget:および-setDoubleAction:を呼び出します。

これが私のテーブルビューデリゲートからの抜粋です。デリゲートもデータソースとして設定しているため、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...
}

お役に立てれば。

54
amateur barista

PRシンが言ったように、ココアバインディングを使用できます。また、選択したオブジェクトを渡すこともできます。

  1. IBでテーブルビューを選択し、[バインド]インスペクターでこれら2つのバインドを次のように設定します。

    >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

10
GeoffCoope

誰かがSwift 2.0バージョンを探している場合:これは私のために働くものです。ObjectiveCコードよりもはるかに簡単に思えます。

@IBOutlet weak var searchResultTable: NSTableView!

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

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

Interface Builderでダブルクリックアクションを関連付けることができます。 Controlキーを押しながらテーブルビューをクリックして(スクロールビュー、クリップビュー、またはテーブル列ではなく、テーブルビューを取得していることを確認してください)、接続パネルを取得します。 「送信済みアクション」セクションで「doubleAction」アイテムを見つけます。選択したIBActionに接続します。

6
rob mayoff

On Swift 4.1 #selector(nameOfYourFunction)を使用して@objc関数を実行するようにコード内でTableViewオブジェクトのdoubleActionメソッドを設定します

この関数内でセグエを呼び出します。新しいウィンドウをInterfaceBuilderのOriginウィンドウにリンクできます(NSTableViewオブジェクトではなく、実際のViewControllerオブジェクトにリンクできます)。

次に、セグエの準備に関する新しいウィンドウのセットアップをすべて実行します。

Interface Builderでまず最初に:

enter image description here

もちろん、そのセグエに識別子を付けます:

enter image description here

次に、最初のView Controller(Table Viewがある場所)内のコード:

 //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)
 }
}

最後に、次のようにコードの初期セットアップ部分でこの関数をTableViewのdoubleActionメソッドに設定します。

override func viewDidLoad() {
    super.viewDidLoad()
    thisTableView.doubleAction = #selector(doubleClickOnResultRow)
}
1
Ryuuzaki Julio

バインディングでも同じことができます。まず、.hファイルで1つのmentodを宣言します

-(IBAction)openWindow:(id)sender

.mファイルに同じものを実装します

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

テーブルビューが存在するそのペン先に行き、テーブルビューを選択して、属性インスペクターの最後から2番目のタブを取得し、二重cicl引数開示三角形チェックバインドを開いてfoxを選択しますファイルの所有者を選択します名前は「openWindow:」になり、同じプロセスが「ダブルクリックターゲット」の開示と同じになります。これは動作します

0
PR Singh