2012-04-18 5 views
7

ボタンをクリックすると、ビューベースのテーブルのボタンの行を取得するにはどうすればよいですか?ボタンがクリックされたときに行は選択されていませんが、ボタンのアクションメソッドにsender.superview.superviewを記録すると、NSTableRowView:0x1001b3a90 - row:2が取得されることがわかりました。私はプログラムでそれをどうやって取得するのか分かりません。私はNSTableCellViewのサブクラスでボタンのアクションメソッドを持っています。ビューベースのテーブルのボタンの行を取得

答えて

8

-[NSTableView rowForView:]は、そのドキュメントでこれを言う:

これは通常、アクションは上の実行されるべき行(および列)を見つけるためにNSButton(またはNSControl)のためのアクションメソッドで必要とされます。

+0

おかげで、このコードを共有する、これは私が必要なものです。ボタンのアクションメソッドでテーブルビューを得ることができます。sender.superview.superview.superviewとsender.superviewのビュー – rdelmar

+0

アクションはコントローラに送信され、そのコントローラはテーブルビューを知っている必要があります。それにはアウトレットが必要です。したがって、スーパービューチェーンに従う必要はありません。また、ビューを直接的または間接的に含む行を検索するので、 '-rowForView:'への引数として 'sender'を渡すことができます。 –

+0

私はビューベースのテーブルでさまざまなUI要素をどのように操作できるかを確認するためにいくつかのテストを行っていましたので、最初は(単純化のために)アプリケーションデリゲートのアクションメソッドを呼び出しました。それから、カスタムテーブルのセルビューに配置します。なぜなら、どこかにあるべき場所を読んでいるからです。あなたのコメントで言ったように、実際にはコントローラーオブジェクト内にあるはずですが、動作させるにはどこに制限がありますか?なぜそれはアプリケーションデリゲートで動作しませんでしたか?ビューベースのテーブルでレスポンダチェーンがどのように見えるのか分かりません。 – rdelmar

1

ここでは簡単な例を示します。ここで私はコンテンツビューでUIButtonを追加しています。私はボタンをクリックしたとき、私はこれがある

-(void)goBuyTab:(UIButton *)sender{ 
    NSLog(@"after click buy button function called goBuyTab"); 
    NSLog(@"sender.tag in goBuyTab : %d",sender.tag); 
    int selectedRow=sender.tag;// This is row number 
} 

希望私は

//Adding a button 
    UIButton *btnBuyer=[UIButton buttonWithType:UIButtonTypeCustom]; 
    btnBuyer.frame=CGRectMake(238, 10, 26, 32); 
    btnBuyer.tag=indexPath.row; 
    [btnBuyer setImage:[UIImage imageNamed:@"buyIcon.png"] forState:UIControlStateNormal]; 
    [btnBuyer addTarget:self action:@selector(goBuyTab:)forControlEvents:UIControlEventTouchUpInside]; 
    [cellNew.contentView addSubview:btnBuyer]; 

を必要とし、ユーザーがこれをクリックしたときに、私は次のメソッドからIDを持って、私は行番号を取得し、呼び出しがメソッドを呼び出すと、あなたが必要としたもの。

-1

OSXであなたは、コントローラに、ボタン電池アクションメソッドでこれを使用することができます。

- (IBAction)yourMethod:(NSButtonCell *)sender { 

NSInteger selected = [yourTableView selectedRow]; 
NSLog(@"sender sends :%ld", selected); 
} 

あなたはNSTableViewにコントローラからコンセントを設定する必要があります。

+0

基本行を選択せず​​に行内のボタンをクリックすることは完全に可能であるため、これは必ずしも機能しません。 – Ely

+0

(セルベースのテーブルビューで) 'sender'が' NSButtonCell'ではなく 'NSTableView'であるため、これも動作しません。 –

0

私はスウィフト4.ため

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 
    ........ 
    but.action = #selector(ViewController.buttonAction) 
    ......... 
} 

@objc func buttonAction(but: NSButton){ 
    let tablerow: NSTableRowView = but.superview?.superview as! NSTableRowView; 
    let index = table?.row(for: tablerow); 
    print("\(index)); 
} 
関連する問題