【问题标题】:Remove data from array on NSTableView with NSButton with Swift使用 Swift 的 NSButton 从 NSTableView 上的数组中删除数据
【发布时间】:2017-01-23 19:12:18
【问题描述】:

我有一个 NSTableView,其中的数据是从数组中填充的。

我创建了一个按钮,当点击该按钮时应该从数组中的该行中删除项目。

我正在为如何从数组中删除数据并删除表格列而苦恼?

我的数组引用是:

var messagesRef: Firebase!
var messages = [Message]()

func setupFirebase() {

    messagesRef = Firebase(url: "https://url")


    messagesRef.queryLimitedToLast(10).observeEventType(FEventType.ChildAdded, withBlock: { (snapshot) in
        let text = snapshot.value["text"] as? String
        let sender = snapshot.value["sender"] as? String
        let imageUrl = snapshot.value["imageUrl"] as? String

        let message = Message(text: text, sender: sender, imageUrl: imageUrl)
        self.messages.append(message)
        self.tableView.reloadData()


    })
}

我的表委托和数据源是:

func numberOfRowsInTableView(tableView: NSTableView) -> Int {
    return self.messages.count
}

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let result = tableView.makeViewWithIdentifier("cell", owner: self) as? secondviewTableCell



    let mess = messages[row]

    result?.textField?.stringValue = mess.text()
    result?.sendertextView.stringValue = mess.sender()

    result?.removeButton.target = self
    result?.removeButton.action = #selector(secondVC.removeFromScreen)



    return result

}

func removeFromScreen(){


    }

我已设法删除 TableView 中的行,但我仍在努力从数组中的行中删除数据。

这是我删除行的函数:

@IBAction func removetablerow(object: NSButton) {

    let row = tableView.rowForView( object as NSView )
    if ( row > -1 ) {
        let indexSet = NSIndexSet( index:row )
        tableView.removeRowsAtIndexes( indexSet, withAnimation: NSTableViewAnimationOptions.EffectFade )
        NSTimer.scheduledTimerWithTimeInterval( 0.5, target: self, selector: #selector(secondVC.rowDeleted(_:)), userInfo: row, repeats: false )


    }
}

【问题讨论】:

    标签: arrays swift nstableview nstablecellview


    【解决方案1】:

    在 macOS 中使用基于视图的表格视图非常容易。

    • 创建一个标准的IBAction 并连接Interface Builder 中的按钮。
    • 在操作中获取带有row(for view: 的行并将sender 作为view 参数传递,例如

      @IBAction func removeFromScreen(_ sender : NSButton)
      {
          let row = self.tableView.row(for: sender)
          messages.remove(at:row)
          tableView.removeRows(at: IndexSet(integer:row), withAnimation:.effectFade)
          // do other things with the row 
      }
      

    没有多余的target,没有多余的action

    编辑:

    Swift 2 的等价物是:

        @IBAction func removeFromScreen(sender : NSButton)
        {
            let row = tableView.rowForView(object)
            messages.removeAtIndex(row)
            tableView.removeRowsAtIndexes( NSIndexSet( index:row ), withAnimation: NSTableViewAnimationOptions.EffectFade )
           // do other things with the row
        }
    

    【讨论】:

    • 我收到一个错误,返回类型为 'NSTableView' 的 Value has no member 'row' with this answer。
    • 抱歉,这是 Swift 3 代码,显然您使用的是 Swift 2。您也必须从 messages 数组中删除该项目。
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 2015-12-02
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多