Objective c NSTableView中的NSTokenFieldCell在进行选项卡切换时崩溃,这是错误吗?
我在使用NSTokenFieldCell时遇到了问题,所以我开始在Xcode中创建一个新项目来隔离这个问题。以下是我所做的:Objective c NSTableView中的NSTokenFieldCell在进行选项卡切换时崩溃,这是错误吗?,objective-c,cocoa,nstableview,nstokenfield,Objective C,Cocoa,Nstableview,Nstokenfield,我在使用NSTokenFieldCell时遇到了问题,所以我开始在Xcode中创建一个新项目来隔离这个问题。以下是我所做的: 将NSTableView拖放到主窗口中 选择第二列的文本单元格,并将其类(通过Identity Inspector)更改为NSTokenFieldCell 使用以下代码实现了尽可能少的数据源对象: - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { return 1; } - (id)
- 将NSTableView拖放到主窗口中李>
- 选择第二列的文本单元格,并将其类(通过Identity Inspector)更改为NSTokenFieldCell李>
- 使用以下代码实现了尽可能少的数据源对象:
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { return 1; } - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { return @"aa, bb"; }
我正在使用Lion 10.7.2中的Xcode 4.2,以及Mac OS X Cocoa应用程序模板附带的所有默认设置。看起来像Cocoa中的一个bug。如果启用“僵尸”,您将看到以下内容:
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
(仅针对令牌列),但我也犯了同样的错误。原来的解决方案带来了一个新问题
当NSTokenFieldCell
未在NSTableView
中完全显示时,进入编辑状态然后退出将导致表视图显示异常
因此,我反复尝试找到更好的解决方案:
class MyTokenFieldCell: NSTokenFieldCell {
override func fieldEditor(for controlView: NSView) -> NSTextView? {
return nil;
}
}
可能是NSTableView
的nstokenieldcell
编辑器重用机制出现问题,导致程序崩溃
在这里被覆盖,返回nil,这将导致每次编辑时都重新创建编辑器,避免重用,从而解决崩溃问题
以下是原始答案 ⚠️ 由于该解决方案会导致其他问题,请忽略它。 我也遇到了这个问题。我的解决方案是暂时保留表视图使用的单元格
class MyTokenFieldCell: NSTokenFieldCell {
static var cells = [NSUserInterfaceItemIdentifier: [MyTokenFieldCell]]()
override func copy(with zone: NSZone? = nil) -> Any {
let cell = super.copy(with: zone)
guard let tokenFieldCell = cell as? MyTokenFieldCell else { return cell }
tokenFieldCell.identifier = self.identifier
guard let identifier = tokenFieldCell.identifier else { return cell }
var cells = MyTokenFieldCell.cells[identifier] ?? []
cells.append(tokenFieldCell)
if cells.count > 4 {
cells.removeFirst()
}
MyTokenFieldCell.cells[identifier] = cells
return cell
}
}
NSTableViewDelegate
的tableView(uu:dataCellFor:row:)
方法,为表视图提供MyTokenFieldCell
,并将标识符设置为::
我也对这种组合感到失望。我没有这样的答案,但我复制了这个问题并发布了代码:虽然很高兴你找到了一个解决方案。问题是关于Objective-C。pyObj和其他语言解决方案是否也应该放在这里?
extension ViewController: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, dataCellFor tableColumn: NSTableColumn?, row: Int) -> NSCell? {
guard let columnIdentifier = tableColumn?.identifier, columnIdentifier.rawValue == "token" else {
return tableColumn?.dataCell(forRow: row) as? NSCell
}
let cell = MyTokenFieldCell()
cell.isEditable = true
cell.identifier = .init("\(columnIdentifier.rawValue):\(row)")
return cell
}
}