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

我已经设置了一个带有嵌入式NSTableView的NSView.

我试图为对表视图单元格进行更改时运行NSTableViewCell的操作:

import Cocoa

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

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

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

由’Table View Cell’发送的动作’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
    }
}

我已在视图中设置表以使用此类:

我本来希望这是这个NSTableView的委托,并能够将TableViewCell的动作添加到MyTable,但它拒绝创建动作.

我错过了哪些步骤?

首先,你必须在tableView单元格中添加一个委托
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")
    }
}

than after that you have to add delegate to the table view

class MyTable: NSTableView,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,owner: self) as! NSTableCellView
        cell.textField!.stringValue = "Hello World"
       cell.delegate = self
        return cell
    }
}

in that class you have to call a method in delegate

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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...