ユーザーがNSTableView
の行をダブルクリックすると、ウィンドウを開くためのアプリケーションが必要です。これを達成する方法に関する情報や例を見つけるのに少し苦労しています。誰かが私を正しい方向に向けることができますか?
-setDoubleAction:
NSTableViewのメソッド。通常のターゲットアクションシステムと同様に、ダブルクリックで呼び出されるメソッドに設定できます。
そのアクションメソッドでは、 -clickedRow
が便利です。
Cocoaの他の新人の利益のために、@ JimPulsの回答にさらに基本的な情報を追加します。
これが私のテーブルビューデリゲートからの抜粋です。デリゲートもデータソースとして設定しているため、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でテーブルビューを選択し、[バインド]インスペクターでこれら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バージョンを探している場合:これは私のために働くものです。ObjectiveCコードよりもはるかに簡単に思えます。
@IBOutlet weak var searchResultTable: NSTableView!
override func viewDidLoad() {
super.viewDidLoad()
searchResultTable.doubleAction = "doubleClickOnResultRow"
}
func doubleClickOnResultRow()
{
print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}
Interface Builderでダブルクリックアクションを関連付けることができます。 Controlキーを押しながらテーブルビューをクリックして(スクロールビュー、クリップビュー、またはテーブル列ではなく、テーブルビューを取得していることを確認してください)、接続パネルを取得します。 「送信済みアクション」セクションで「doubleAction」アイテムを見つけます。選択したIBActionに接続します。
On Swift 4.1 #selector(nameOfYourFunction)を使用して@objc関数を実行するようにコード内でTableViewオブジェクトのdoubleActionメソッドを設定します
この関数内でセグエを呼び出します。新しいウィンドウをInterfaceBuilderのOriginウィンドウにリンクできます(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を選択しますファイルの所有者を選択します名前は「openWindow:」になり、同じプロセスが「ダブルクリックターゲット」の開示と同じになります。これは動作します