Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSTableView中的NSTokenFieldCell在进行选项卡切换时崩溃,这是错误吗?_Objective C_Cocoa_Nstableview_Nstokenfield - Fatal编程技术网

Objective c NSTableView中的NSTokenFieldCell在进行选项卡切换时崩溃,这是错误吗?

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)

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

  • 将NSTableView拖放到主窗口中
  • 选择第二列的文本单元格,并将其类(通过Identity Inspector)更改为NSTokenFieldCell
  • 使用以下代码实现了尽可能少的数据源对象:

    - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
        return 1;
    }
    
    - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
        return @"aa, bb";
    }
    
起初,它似乎工作正常,但如果双击要编辑的单元格,然后使用tab和shift+tab来回切换单元格,则当令牌字段单元格接收焦点时,应用程序最终会因访问错误而崩溃


我正在使用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,这将导致每次编辑时都重新创建编辑器,避免重用,从而解决崩溃问题


以下是原始答案

⚠️ 由于该解决方案会导致其他问题,请忽略它。

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

  • 自定义NSTokenFieldCell:在每次复制后,临时保存该副本

     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
        }
    }