質問

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

役に立ちましたか?

解決

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

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

他のヒント

Cocoaの新規参入者のために、@ JimPulsの回答に基本情報を追加します。

  1. NSTableViewへのIBOutletは、インターフェイスで宣言する必要があります。私は、テーブルのデリゲートでそうすることが好ましいと思いました。
  2. テーブルへのIBOutletは、Interface Builderを介して接続する必要があります。そのためには、Ctrlキーを押しながらドラッグ&テーブルビューへのアウトレットを宣言するクラスからIBをドロップします。マウスを離すと、ステップ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...
}

これがお役に立てば幸いです。

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

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

@IBOutlet weak var searchResultTable: NSTableView!

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

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

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

SWIFT 4.1の場合 #selector(nameOfYourFunction)

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

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

次に、セグエの準備に関する新しいウィンドウの設定をすべて行います。

Interface Builderで最初に申し上げます:

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

次に、最初の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)
}

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

-(IBAction)openWindow:(id)sender

.mファイルで同じものを実装

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

テーブルビューが存在するそのペン先に移動し、テーブルビューを選択して、属性インスペクターの最後から2番目のタブを取得し、二重cicl引数開示三角形チェックバインドを選択して、foxの選択ファイルの所有者をチェックし、モデルキーpatは&quot; self&quot ;、セレクタ名は&quot; openWindow:&quot ;、同じプロセスは&quot;ダブルクリックターゲット&quot;開示、 これは動作します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top