2016-05-11 11 views
7

NSTableViewが組み込まれたNSViewをセットアップしました。OSX:ビューベースのテーブルビュー内のオブジェクトは、テーブルビューのデリゲートにしか接続できません

私はNSTableViewCellは変更がテーブルビューセルに行われたときに実行するアクションを設定しようとした enter image description here

:NSViewControllerを使用した場合

import Cocoa 

class MyView: NSView 
{ 
    override func drawRect(dirtyRect: NSRect) 
    { 
     super.drawRect(dirtyRect) 
    } 

    @IBAction func valEntered2(sender: AnyObject) 
    { 
     Swift.print("valueEntered2") 
    } 
} 

このアプローチは、以前にうまく働いたがストーリーボード上で、このコードをコンパイルすると、警告が表示されます。

Action 'valEntered2:'は 'Table View Cell'によって送信され、無効なターゲットである 'View'に接続されていますテーブルビューのデリゲートに接続すること)

だから、私は私ではなく、そこに移動することができますNSTableViewをサブクラス化している、それはアクションがNSViewのにいる好きではないようです:。

class MyTable: NSTableView, NSTableViewDataSource, NSTableViewDelegate 
{ 
    let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate 

    override init(frame frameRect: NSRect) 
    { 
     super.init(frame: frameRect) 
    } 

    required init?(coder: NSCoder) 
    { 
     super.init(coder: coder) 
     self.setDataSource(self) 
     self.setDelegate(self) 
    } 

    override func drawRect(dirtyRect: NSRect) 
    { 
     super.drawRect(dirtyRect) 
    } 

    func numberOfRowsInTableView(tableView: NSTableView) -> Int 
    { 
     return 5 
    } 

    func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? 
    { 
     let cell: NSTableCellView = tableView.makeViewWithIdentifier(tableColumn!.identifier, owner: self) as! NSTableCellView 
     cell.textField!.stringValue = "Hello World" 
     return cell 
    } 
} 

私はセットアップにこのクラスを使用するには、ビューでテーブルを持っている:

enter image description here

私は、これがこのNSTableViewの委譲するとMyTableとにTableViewCellのアクションを追加することができると期待しているだろうが、それが作成することを拒否行為イオン。

どのような手順がありますか?

答えて

0

あなたは、テーブルビュー

class MyTable: NSTableView, NSTableViewDataSource, NSTableViewDelegate,cellAction 
{ 
    let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate 

    override init(frame frameRect: NSRect) 
    { 
     super.init(frame: frameRect) 
    } 

    required init?(coder: NSCoder) 
    { 
     super.init(coder: coder) 
     self.setDataSource(self) 
     self.setDelegate(self) 
    } 

    override func drawRect(dirtyRect: NSRect) 
    { 
     super.drawRect(dirtyRect) 
    } 

    func numberOfRowsInTableView(tableView: NSTableView) -> Int 
    { 
     return 5 
    } 

    func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? 
    { 
     let cell: NSTableCellView = tableView.makeViewWithIdentifier(tableColumn!.identifier, owner: self) as! NSTableCellView 
     cell.textField!.stringValue = "Hello World" 
     cell.delegate = self 
     return cell 
    } 
} 

にデリゲートを追加することが必要であることの後よりも

import Cocoa 
protocol cellAction { 
    func CellAction() 
} 

class MyView: NSView 
{ 
var delegate:cellAction! 
    override func drawRect(dirtyRect: NSRect) 
    { 
     super.drawRect(dirtyRect) 
    } 

    @IBAction func valEntered2(sender: AnyObject) 
    { 
     delegate.CellAction() 
     Swift.print("valueEntered2") 
    } 
} 

のようなあなたのtableView細胞にデリゲートを追加する必要があり、すべての最初のそのクラスでデリゲートのメソッドを呼び出す必要があります

func CellAction(){ 
//here you get the call back 
} 
+0

変更を自分のコードにコピーしました。 cell.delegate = selfという行は、NSTableCellView型の値にメンバーデリゲートがないことを示します。私はまだコンパイル時に同じ警告を受けています。 – iphaaw

+0

uitableviewクラスの "cellAction"デリゲートを追加しました –

+0

はい。コードをコピーして貼り付けました。 – iphaaw

関連する問題