使用 Swift 使用 NSButton 从 NSTableView 上的数组中删除数据
Remove data from array on NSTableView with NSButton with Swift
我有一个 NSTableView,其中的数据是从一个数组中填充的。
我创建了一个按钮,当点击该按钮时应该从数组中的该行中删除项目。
我对如何从数组中删除数据并删除 table 列感到困惑?
我的数组引用是:
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()
})
}
我的 table 委托和数据源是:
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 )
}
}
在 macOS 中使用基于视图的 table 视图非常容易。
- 创建标准
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
。
编辑:
Swift2 等价于:
@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,其中的数据是从一个数组中填充的。
我创建了一个按钮,当点击该按钮时应该从数组中的该行中删除项目。
我对如何从数组中删除数据并删除 table 列感到困惑?
我的数组引用是:
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()
})
}
我的 table 委托和数据源是:
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 )
}
}
在 macOS 中使用基于视图的 table 视图非常容易。
- 创建标准
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
。
编辑:
Swift2 等价于:
@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
}