基于 NSTableView 的视图的目标操作数据源更新
我遇到的情况是,我使用基于视图的表视图,并且不想在数据源和表视图之间使用绑定。这主要是由于我的 NSTableCellView 可以有多个子视图、复杂的验证以及对其他对象中方法的触发调用。
我们有非常清晰的使用数据源更新 NSTableView 的路径:
tableView:viewForTableColumn:row:
但是,对于向后,即使用 NSTableView 中的更新更新数据源,我们没有基于单元格的表视图的那种类型:
tableView:setObjectValue:forTableColumn:row:
建议改为目标操作模式。所以,我基本上有两个问题:
- 如果我为一个特定视图或其子视图设置目标和操作,如何获取正确的行和列信息以了解数据源中要更新的内容?
尽管我已经编辑或更改了一个子视图对象,但 NSTableView 中的 clickedRow 和 clickedColumn 是否应该解决这一问题?
- 如果操作将传递例如 NSTextField 作为参数,我如何通知目标(作为其他对象,而不是 NSTableView 实例)有关行和列的信息?
我基本上可以通过子视图树来到 clickedColumn 和 clickedRow (如果这两个属性是第一个问题的正确答案),但我发现这几乎是不优雅的解决方案,并且预感有更好的方法....
提前致谢....
I have situation where I use view based Table Views and don't want to use bindings between data source and table view. This is mainly due to the fact that my NSTableCellView can have multiple subviews, complex validation and triggered calls to methods in other objects.
We have very clear path of updating NSTableView with data source with:
tableView:viewForTableColumn:row:
However, for backwards, that is updating datasource with updates in NSTableView we have nothing of the sort we have for cell based Table views:
tableView:setObjectValue:forTableColumn:row:
Target Action pattern is suggested instead. So, I have basically 2 questions:
- If I set target and action for one specific view, or its subview, how do I get proper row and column info to know what to update in data source?
Should clickedRow and clickedColumn from NSTableView do the trick, although I have edited or changed one subview object?
- How can I inform the target (as other object, not NSTableView instance) about row and column if action will pass for example NSTextField as parameter?
I can basically come to clickedColumn and clickedRow (if those 2 properties are proper answer to first question) through subview tree, but I find this as pretty much non-elegant solution and have hunch there is a better way....
THanks in advance....
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
NSTableCellView
有一个objectValue
。想必您已经设置了它,因此该操作可以使用[(NSTableCellView *)[sender superview] objectValue]
来找出它需要操作的对象。我建议您还子类化
NSTableCellView
并在那里实现操作。如果您需要访问模型的其他部分,您可以为视图控制器添加一个插座。如果您确实需要行号,可以在内容数组上调用
indexOfObject
。NSTableCellView
has anobjectValue
. Presumably you're already setting it, so the action can use[(NSTableCellView *)[sender superview] objectValue]
to find out which object it needs to manipulate.I suggest that you also subclass
NSTableCellView
and implement the action there. If you need access to other parts of the model, you can add an outlet for your view controller.If you really need the row number, you can call
indexOfObject
on your content array.两个 NSTableView 方法 rowForView 和 columnForView 应该可以解决问题。
您可以使用目标/操作方法的发送者来调用它们,例如由 TableView 中的 NSButton 触发的方法(可以将其放在子视图中的某个位置)
或者,您可以从委托方法实现中调用这些方法,例如 NSTextDelegate 中的 textDidChange。这样你就可以轻松更新你对应的Array了。
如果您不希望持续更新,textDidEndEditing 也可以完成这项工作。
The two NSTableView Methods rowForView and columnForView should do the trick.
You can call them with the sender of an Target/Action Method, like one triggered by an NSButton in your TableView (its ok, to have it somewhere in a subwiew)
Or you can call these Methods from within a delegate method implementation like the textDidChange from NSTextDelegate. So you can easily update your corresponding Array.
If you don't want continous updates textDidEndEditing would also do the job.