gpt4 book ai didi

Swift 4/Xcode 10 错误消息 : Illegal NSOutlineView data source

转载 作者:行者123 更新时间:2023-12-04 10:55:56 34 4
gpt4 key购买 nike

***** 适合我的解决方案 ******

退出并重新启动 Xcode 修复了该问题

我在我的项目中使用 Xcode 10 和 swift 4。

如果在我的项目中自定义 View ,我正在使用 IB 创建自己的 View Controller 以将它们集成。

在其中一个 View Controller 上,我使用 NSOutlineView 来显示网络设备列表。

    public class applianceListPickerViewController: NSViewController, NSOutlineViewDelegate, NSOutlineViewDataSource {




@IBOutlet weak var applianceTreeView: NSOutlineView!
private var listOfAppliances = [appliance]()

override public func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.

self.applianceTreeView.dataSource = self
self.applianceTreeView.delegate = self
self.readRouterListFromFile(fileName: "lab_list")
self.applianceTreeView.reloadData()
}

func readRouterListFromFile(fileName: String) -> Any?
{
var listOfRouters = [BSDRouters]()
if let path = Bundle.main.path(forResource: fileName, ofType: "json") {
do {
let fileUrl = URL(fileURLWithPath: path)
// Getting data from JSON file using the file URL

let data = try Data(contentsOf: fileUrl, options: .mappedIfSafe)
listOfRouters = try JSONDecoder().decode([BSDRouters].self, from: data)

} catch {
// Handle error here
print ("Not a valid Router list \(error)")
return nil
}
}
else{
return nil
}
for currentRouter in listOfRouters {
let anAppliance = appliance.init(withName: currentRouter.name)
self.listOfAppliances.append(anAppliance )
}
return listOfRouters
}

// MARK: - Data Source functions


// This one returns the appliances count if item is an appliance and pipe counts if its a pipe

private func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
if let currentItem = item as? appliance {
return currentItem.listOfipes.count
}
return listOfAppliances.count

}


private func outlineView(_ outlineView: NSOutlineView, objectValueFor tableColumn: NSTableColumn?, byItem item: Any?) -> Any?{
print("Don't know why I have to define this one but its in the error message so I declare it")
return nil
}

// This one returns an appliance object if item is an appliance and a pipe object if its a pipe

private func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
if let currentItem = item as? appliance {
return currentItem.listOfipes[index]
}

return listOfAppliances[index]
}

private func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
if let currentItem = item as? appliance {
return currentItem.listOfipes.count > 0
}
return false
}

// MARK: - Delegates functions functions


private func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
var view: NSTableCellView?
if let currentItem = item as? appliance {
view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "routerCell"), owner: self) as? NSTableCellView
if let textField = view?.textField {
textField.stringValue = currentItem.name
textField.sizeToFit()
}
}
return view
}}

我在调试部分收到以下错误消息:

Illegal NSOutlineView data source (). Must implement outlineView:numberOfChildrenOfItem:, outlineView:isItemExpandable:, outlineView:child:ofItem: and outlineView:objectValueForTableColumn:byItem:



这是不幸的,因为我已经定义了方法!

在文档中阅读它说可选方法 outlineView(_ outlineView: NSOutlineView, objectValueFor tableColumn: NSTableColumn?, byItem item: Any?) -> Any?当不使用我手动设置数据源和委托(delegate)时执行的 Cocoa 绑定(bind)时,这是强制性的。

我也一直在看这个: Error: Illegal NSOutlineView data source但它不包含任何解决我的问题的线索。

在 IB 上,我已将 outlet applianceTreeView 链接到我的 xib 的 OutlineView。

我尝试在 viewdidload 之后手动设置 applianceTreeView 的委托(delegate)和数据源,因为 nsoutlineview 似乎不符合委托(delegate)和数据源的协议(protocol),但没有成功仍然收到相同的错误消息。

编辑:

数据源和委托(delegate)分配可能有问题,因为我可以看到数据源和委托(delegate)不是指向 View Controller (自身 0x00006000000e3300),而是指向大纲 View (大纲 View 0x0000000101603e40),如下图所示: enter image description here

最佳答案

替换 privatepublic

// This one returns the appliances count if item is an appliance and pipe counts if its a pipe

public func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
if let currentItem = item as? appliance {
return currentItem.listOfipes.count
}
return listOfAppliances.count

}


public func outlineView(_ outlineView: NSOutlineView, objectValueFor tableColumn: NSTableColumn?, byItem item: Any?) -> Any?{
print("Don't know why I have to define this one but its in the error message so I declare it")
return nil
}

关于Swift 4/Xcode 10 错误消息 : Illegal NSOutlineView data source,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59196475/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com