在基于 NSTableView 的视图中删除和添加行
delete and add row in view Based NSTableView
我进行了 IOS 开发,但对 OSX 是新手。我遇到的问题是,我通过单击 table 行中的按钮成功删除了 NStableView 中的行,但是当我单击添加按钮时,删除的行再次出现,然后没有被删除。
这是我的删除功能
func delIssue(_ sender:NSButton)
{
let btn = sender
if btn.tag >= 0
{
let issueValue = issueKeys[btn.tag]
for index in 0..<issueName.count
{
if issueValue == issueName[index]
{
issueName.remove(at: index)
rowCount = rowCount - 1
self.tableView.removeRows(at: NSIndexSet.init(index: index) as IndexSet , withAnimation: .effectFade)
self.tableView.reloadData()
break
}
}
}
}
rowCount 基本上是变量,我分别在添加行时递增,在删除行时递减。
我的添加行函数是
@IBAction func addRow(_ sender: Any)
{
rowCount += 1
DispatchQueue.main.async
{
self.tableView.reloadData()
}
}
数据源为
func numberOfRows(in tableView: NSTableView) -> Int
{
return rowCount
}
最后我发现可以正确删除行,我就是这样做的
self.tableView.beginUpdates()
self.tableView.removeRows(at: indexSet , withAnimation: .effectFade)
self.tableView.endUpdates()
不要将标签分配给 NSTableView
中的按钮
NSTableView
提供了一个非常方便的获取当前行的方法:方法
func row(for view: NSView) -> Int
action中的代码可以减少到3行
@IBAction func delIssue(_ sender: NSButton)
{
let row = tableView.row(for: sender)
issueName.remove(at: row)
tableView.removeRows(at: IndexSet(integer: row), withAnimation: .effectFade)
}
要添加一行,请将一个值附加到数据源数组,然后调用 insertRows
@IBAction func addRow(_ sender: Any)
{
let insertionIndex = issueName.count
issueName.append("New Name")
tableView.insertRows(at: IndexSet(integer:insertionIndex), withAnimation: .effectGap)
}
注:
永远不要在 insert- / removeRows
之后调用 reloadData
。您摆脱了动画,插入/删除方法确实更新了 UI。 beginUpdates
和 endUpdates
方法对于单个插入/移动/删除操作没有用。
我进行了 IOS 开发,但对 OSX 是新手。我遇到的问题是,我通过单击 table 行中的按钮成功删除了 NStableView 中的行,但是当我单击添加按钮时,删除的行再次出现,然后没有被删除。 这是我的删除功能
func delIssue(_ sender:NSButton)
{
let btn = sender
if btn.tag >= 0
{
let issueValue = issueKeys[btn.tag]
for index in 0..<issueName.count
{
if issueValue == issueName[index]
{
issueName.remove(at: index)
rowCount = rowCount - 1
self.tableView.removeRows(at: NSIndexSet.init(index: index) as IndexSet , withAnimation: .effectFade)
self.tableView.reloadData()
break
}
}
}
}
rowCount 基本上是变量,我分别在添加行时递增,在删除行时递减。 我的添加行函数是
@IBAction func addRow(_ sender: Any)
{
rowCount += 1
DispatchQueue.main.async
{
self.tableView.reloadData()
}
}
数据源为
func numberOfRows(in tableView: NSTableView) -> Int
{
return rowCount
}
最后我发现可以正确删除行,我就是这样做的
self.tableView.beginUpdates()
self.tableView.removeRows(at: indexSet , withAnimation: .effectFade)
self.tableView.endUpdates()
不要将标签分配给 NSTableView
NSTableView
提供了一个非常方便的获取当前行的方法:方法
func row(for view: NSView) -> Int
action中的代码可以减少到3行
@IBAction func delIssue(_ sender: NSButton)
{
let row = tableView.row(for: sender)
issueName.remove(at: row)
tableView.removeRows(at: IndexSet(integer: row), withAnimation: .effectFade)
}
要添加一行,请将一个值附加到数据源数组,然后调用 insertRows
@IBAction func addRow(_ sender: Any)
{
let insertionIndex = issueName.count
issueName.append("New Name")
tableView.insertRows(at: IndexSet(integer:insertionIndex), withAnimation: .effectGap)
}
注:
永远不要在 insert- / removeRows
之后调用 reloadData
。您摆脱了动画,插入/删除方法确实更新了 UI。 beginUpdates
和 endUpdates
方法对于单个插入/移动/删除操作没有用。