【发布时间】:2021-07-11 15:07:35
【问题描述】:
我的视图控制器打开一个目录,计算其中的文件类型并将结果存储在文件类型和计数的字典 [String:Int] 中。我有一个显示这个的 TableView。
当我第一次打开一个目录时,ViewController 会在 FileTypeTableview 中正确显示信息。如果我尝试打开另一个目录,则执行到该行:
let dialogButton = dialog.runModal()
然后立即跳转到我的 TableView 函数中的一行并在此处抛出一个超出范围的索引:
val = types[row]
Types 是 [String] 并显示 0 个元素,row 是 Int 并显示 0。 我对在 dialog.runModal() 函数调用中发生这种情况感到困惑。
以下是获取目录并显示 TableView 的函数。 我对 Swift 和 MacOS 编程非常陌生,如果有任何见解,我将不胜感激。
@IBAction func getFolder(_ sender: Any) {
let dialog = NSOpenPanel()
dialog.canChooseDirectories = true
dialog.canChooseFiles = false
allFiles = []
fileTypesDict.removeAll()
let dialogButton = dialog.runModal()
if let theURL = dialog.url {
theDirectory = theURL.path
allFilesAsPaths = getAllFiles2(atDirectoryPath: theURL.path)
allFilesAsPaths.sort()
}
fileCountLabel.stringValue = String(allFilesAsPaths.count)
mainTableView2.reloadData()
fileTypeTableView.reloadData()
}
func numberOfRows(in tableView: NSTableView) -> Int {
var numberOfRows : Int = 0
if tableView == mainTableView2 {
print("number of rows for mainTableView2")
numberOfRows = allFilesAsPaths.count
} else if tableView == fileTypeTableView {
print("number of rows for fileTypeTableView")
numberOfRows = fileTypesDict.count
} else if tableView == exifTableView {
numberOfRows = exifData.count
print("exifData.count = \(exifData.count)")
print("number of rows for exifTableview \(numberOfRows)")
}
return numberOfRows
}
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
var val : String = ""
if tableView == mainTableView2 {
val = allFilesAsPaths[row]
}
if tableView == exifTableView {
if tableColumn?.identifier.rawValue == "tag" {
let tagArray : [String] = Array(exifData.keys)
val = tagArray[row]
} else if tableColumn?.identifier.rawValue == "value" {
let valueArray : [String] = Array(exifData.values)
val = valueArray[row]
}
}
if tableView == fileTypeTableView {
let types : [String] = Array(fileTypesDict.keys)
let counts : [Int] = Array(fileTypesDict.values)
if tableColumn?.identifier.rawValue == "type" {
val = types[row]
} else {
val = String(counts[row])
}
}
return val
}
【问题讨论】:
-
在没有可用数据时尝试检查您是否正在制作单元格。简而言之:当 indexpath 超过你的 arrayList
-
可能提供更多代码或更准确地描述您想要实现的目标(表格和项目的性质),因为这就像您在一个类中处理三个不同的表格。
标签: swift macos nstableview