2016-05-11 7 views
7

Ich habe ein NSView mit einem eingebetteten NSTableView eingerichtet.OSX: Objekte innerhalb sichtbasierter Tabellenansichten dürfen nur mit dem Delegaten der Tabellenansicht verbunden werden.

enter image description here

Ich habe versucht, eine Aktion zu setzen für das NSTableViewCell ausgeführt werden, wenn eine Änderung an die Tabellenansicht Zelle hergestellt wird:

import Cocoa 

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

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

Obwohl dieser Ansatz in Ordnung zuvor gearbeitet hat, wenn einen NSViewController mit auf einem Storyboard, wenn ich diesen Code kompilieren gibt es eine Warnung:

Aktion 'valEntered2:' gesendet von 'Table View Cell' ist verbunden mit 'Ansicht', ein ungültiges Ziel (Objekte in der Ansicht basieren Tabellenansichten sie nur an der Tabellenansicht des Delegierten angeschlossen werden)

So scheint es, dass es die Aktion nicht wie es in den NSView ist, so habe ich subclassed NSTableView so kann ich es dort stattdessen bewegen.

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

I haben Setup die Tabelle in der Ansicht, diese Klasse zu verwenden:

enter image description here

ich habe dies zu erwarten wäre die Delegierten für diese NSTableView sein und in der Lage sein die TableViewCell die Aktion zu MyTable hinzufügen, aber es weigert sich, erstellen die Handlung Ion.

Welche Schritte habe ich verpasst?

Antwort

0

allererst müssen Sie einen Delegaten in Ihrer Tableview Zelle hinzufügen, wie

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

als nach, dass Sie Delegierten der Tabellenansicht

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

hinzufügen müssen In dieser Klasse müssen Sie eine Methode in Delegat

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

Ich habe die Änderungen in meinen Code kopiert. Die Zeile cell.delegate = self gibt den Wert vom Typ NSTableCellView hat keinen Mitgliedsdelegierten. Ich bekomme immer noch die gleiche Warnung bei der Kompilierung. – iphaaw

+0

haben Sie den Delegaten "cellAction" in der Klasse "uitableview" hinzugefügt –

+0

Ja. Ich habe Ihren Code kopiert und eingefügt. – iphaaw