首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTokenFieldCell in NSTableView在选项卡时崩溃,是错误吗?

NSTokenFieldCell in NSTableView在选项卡时崩溃,是错误吗?
EN

Stack Overflow用户
提问于 2011-10-27 02:36:33
回答 2查看 541关注 0票数 3

我在NSTokenFieldCell上遇到了问题,所以我开始用Xcode创建一个新项目来隔离这个问题。以下是我所做的:

  • 把一个NSTableView丢到主窗口;
  • 选择第二列的文本单元格,并将其类(通过身份检查器)更改为NSTokenFieldCell;
  • 使用以下代码实现最小可能的数据源对象:
  • (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {返回1;}- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn行:(NSInteger)行{bb @"aa,bb";}

起初,它似乎很好,但是如果您双击一个单元格进行编辑,然后选项卡和shift+tab来回切换单元格,则当令牌字段单元格接收到焦点时,应用程序最终会崩溃。

我在Lion10.7.2中使用了Xcode 4.2,附带了模板的所有默认设置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-31 05:05:01

好像是可可里的虫子。如果你打开僵尸,你会看到这个:

代码语言:javascript
复制
2011-10-31 00:02:43.802 tokenfieldtest[35622:307] *** -[NSTokenFieldCell respondsToSelector:]: message sent to deallocated instance 0x1da761f10

我尝试为表设置一个委托并实现- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row,每次都返回一个新的NSTokenFieldCell (仅针对令牌列),但我得到了相同的错误。

票数 4
EN

Stack Overflow用户

发布于 2021-05-26 03:16:42

原来的解决方案带来了一个新的问题。

NSTokenFieldCell未在NSTableView中完全显示时,进入编辑状态然后退出将导致表视图异常显示。

因此,我多次试图找到一个更好的解决方案:

代码语言:javascript
复制
class MyTokenFieldCell: NSTokenFieldCell {
    override func fieldEditor(for controlView: NSView) -> NSTextView? {
        return nil;
    }
}

可能是NSTableViewNSTokenFieldCell编辑器重用机制存在问题,导致程序崩溃。

fieldEditorForView:在这里被覆盖,返回零,这将导致每次编辑时重新创建编辑器,避免重用,从而解决崩溃问题。

以下是最初的答案。

因为该解决方案会导致其他问题,请忽略它.

我也遇到了这个问题。我的解决方案是暂时保留表视图使用的单元格。

  1. 自定义NSTokenFieldCell:在每个副本之后,临时保存副本。 类MyTokenFieldCell: NSTokenFieldCell { static cell = NSUserInterfaceItemIdentifier:[MyTokenFieldCell]重写func复制(带zone: NSZone?= nil) ->任何{ let cell = super.copy(with: zone)保护,让tokenFieldCell =cell as?如果MyTokenFieldCell >4{ cells.count ( cells.removeFirst() }} MyTokenFieldCell.cellsidentifier = cell返回单元}},则cells.append(tokenFieldCell)如果cells.count>4{cells.removeFirst()} MyTokenFieldCell.cellsidentifier = cell返回单元},则让标识符= tokenFieldCell.identifier其他{返回单元} var单元=MyTokenFieldCell.cellsidentifier?[] cells.append(TokenFieldCell)
  2. 实现NSTableViewDelegateNSTableViewDelegate方法,为表视图提供MyTokenFieldCell,并将标识符设置为:<columnIdentifier>:<row> 扩展ViewController: NSTableViewDelegate { func tableView(_ tableView: NSTableView,dataCellFor tableColumn: NSTableColumn?,row: Int) -> NSCell?NSCell } let cell = MyTokenFieldCell() cell.isEditable = cell.identifier =.init(“(columnIdentifier.rawValue):(行)”)返回单元格}}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7911165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档