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
Swift 如何在编辑模式下将项目添加到NSOutlineView中?_Swift_Cocoa_Nstextfield_Nsoutlineview_Nstablecellview - Fatal编程技术网

Swift 如何在编辑模式下将项目添加到NSOutlineView中?

Swift 如何在编辑模式下将项目添加到NSOutlineView中?,swift,cocoa,nstextfield,nsoutlineview,nstablecellview,Swift,Cocoa,Nstextfield,Nsoutlineview,Nstablecellview,我正在使用NSOutlineView,一切正常,单击表格单元格时可以进入编辑模式 但是,我希望在插入新行时自动进入编辑模式 我使用了makeFirstResponder方法,但它不起作用 以下是我所做的: // ------------------------------------------------------------------------------- // viewForTableColumn:tableColumn:item // ---------

我正在使用
NSOutlineView
,一切正常,单击表格单元格时可以进入编辑模式

但是,我希望在插入新行时自动进入编辑模式

我使用了
makeFirstResponder
方法,但它不起作用

以下是我所做的:

    // -------------------------------------------------------------------------------
    //  viewForTableColumn:tableColumn:item
    // -------------------------------------------------------------------------------
    func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
        var result = outlineView.make(withIdentifier: tableColumn?.identifier ?? "", owner: self)

        if let node = (item as! NSTreeNode).representedObject as? BaseNode {
            if self.outlineView(outlineView, isGroupItem: item) {    // is it a special group (not a folder)?
                // Group items are sections of our outline that can be hidden/shown (i.e. PLACES/BOOKMARKS).
                let identifier = outlineView.tableColumns[0].identifier

                result = outlineView.make(withIdentifier: identifier, owner: self) as! NSTableCellView?
                let value = node.nodeTitle
                (result as! NSTableCellView).textField!.stringValue = value
            } else if node.isSeparator {
                result = outlineView.make(withIdentifier: "SeparatorView", owner: self)
            } else {
                (result as! NSTableCellView).textField!.stringValue = node.nodeTitle
                (result as! NSTableCellView).imageView!.image = node.nodeIcon
                if node.isLeaf {
                     let textField = (result as! NSTableCellView).textField!
                     (result as! NSTableCellView).window?.makeFirstResponder(textField)
                    textField.isEditable = true // make leaf title's editable.
                    //### Translator's extra
                    textField.target = self
                    textField.action = #selector(self.didEditTextField(_:))
                }
            }
        }

        return result
    }

提前感谢。

self.treeController.insert(node,atArrangedObjectIndexPath:indexPath)之后。
您可以开始编辑

DispatchQueue.main.async(execute: {
    let node = self.treeController.arrangedObjects.descendant(at: indexPath)
    let row = self.outlineView.row(forItem: node)
    let view = self.outlineView.view(atColumn: 0, row: row, makeIfNecessary: false)
    if let cellView = view as? NSTableCellView {
        if let textField = cellView.textField {
            if textField.acceptsFirstResponder {
                self.window.makeFirstResponder(textField)
            }
        }
    }
})

您没有显示所有相关的代码行。甚至没有人知道您的数据源。@ElTomato,数据有什么问题吗?这是一个相当大的类,它实现了NSViewController、NSOutlineViewDeleteGate、NSOutlineViewDataSource,我也在使用NSTreeController。我只是想了解在Swift中实现这一点的通常方法是什么。谢谢。插入新行时,您不能自动进入编辑模式,您必须进行一些编码。如何插入新行?@Willeke,这就是为什么我要问:)节点是通过
NSTreeController
插入的
self.treeController.insert(节点,atArrangedObjectIndexPath:indexPath)
。然后我返回用于显示上述方法中指定项和列的视图。谢谢!我会试试你的答案,这样看来
textField.acceptsFirstResponder
在我的情况下总是错误的……好吧,我把你的代码添加到了我上面写的方法中,它工作了!但是在self.treeController.insert之后,它就不起作用了。再次感谢<如果文本字段不可编辑,则code>acceptsFirstResponder为false。谢谢您的帮助,@Willeke!