OSX:基于视图的表视图中的对象只能连接到表视图的委托

时间:2016-05-11 11:38:50

标签: swift macos nstableview nsview

我已经使用嵌入式NSTableView设置了NSView。

enter image description here

我尝试设置NSTableViewCell的操作,以便在对表视图单元格进行更改时运行:

import Cocoa

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

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

虽然这种方法在故事板上使用NSViewController之前已经运行良好,但是当我编译此代码时它会发出警告:

行动' valEntered2:'由表格查看单元格'已连接到' View',一个无效的目标(基于视图的对象内部表格视图,它们只连接到表格视图的委托。)

所以看起来它并不喜欢NSView中的动作所以我已经将NSTableView子类化了,所以我可以把它移到那里:

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的委托,并且能够将TableViewCell的动作添加到MyTable,但它拒绝创建动作。

我错过了哪些步骤?

1 个答案:

答案 0 :(得分:0)

首先,您必须在tableView单元格中添加委托,如

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

之后你必须将委托添加到表视图

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

在该类中,您必须在委托中调用方法

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

    <Spinner
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</android.support.v7.widget.Toolbar>