swift - 我无法弄清楚我在 Swift 中使用 SpreadsheetView 的问题
问题描述
帮助!我无法弄清楚我对 SpreadsheetView 的问题。我遇到的问题是当我分配电子表格视图.datasource = self. 它说它解开了一个可选值并返回 nil。这是我的代码。
import UIKit
import SpreadsheetView
class InventoryViewController: UIViewController, SpreadsheetViewDataSource, SpreadsheetViewDelegate {
@IBOutlet weak var spreadsheetView: SpreadsheetView!
var header = [String]()
var data = [[String]]()
enum Sorting {
case ascending
case descending
var symbol: String {
switch self {
case .ascending:
return "\u{25B2}"
case .descending:
return "\u{25BC}"
}
}
}
func downloadFile()-> URL{
let url = URL(string: "http://192.168.1.125:8000/newheights.txt")!
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig)
let localURL = url
let task = URLSession.shared.downloadTask(with: url) { localURL, urlResponse, error in
if let localURL = localURL {
if let string = try? String(contentsOf: localURL) {
print(string)
}
}
}.resume()
return localURL
}
var sortedColumn = (column: 0, sorting: Sorting.ascending)
override func viewDidLoad() {
super.viewDidLoad()
spreadsheetView.dataSource = self
spreadsheetView.delegate = self
spreadsheetView.register(HeaderCell.self, forCellWithReuseIdentifier: String(describing: HeaderCell.self))
spreadsheetView.register(TextCell.self, forCellWithReuseIdentifier: String(describing: TextCell.self))
let localURL = downloadFile()
let data = try! String(contentsOf: localURL, encoding: .utf8)
.components(separatedBy: "\r\n")
.map { $0.components(separatedBy: "\t") }
header = data[0]
self.data = Array(data.dropFirst())
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
spreadsheetView.flashScrollIndicators()
}
// MARK: DataSource
func numberOfColumns(in spreadsheetView: SpreadsheetView) -> Int {
return header.count
}
func numberOfRows(in spreadsheetView: SpreadsheetView) -> Int {
return data.count - 1
}
func spreadsheetView(_ spreadsheetView: SpreadsheetView, widthForColumn column: Int) -> CGFloat {
return 140
}
func spreadsheetView(_ spreadsheetView: SpreadsheetView, heightForRow row: Int) -> CGFloat {
if case 0 = row {
return 60
} else {
return 44
}
}
func frozenRows(in spreadsheetView: SpreadsheetView) -> Int {
return 1
}
func frozenColumns(in spreadsheetView: SpreadsheetView) -> Int {
return 1
}
func spreadsheetView(_ spreadsheetView: SpreadsheetView, cellForItemAt indexPath: IndexPath) -> Cell? {
if case 0 = indexPath.row {
let cell = spreadsheetView.dequeueReusableCell(withReuseIdentifier: String(describing: HeaderCell.self), for: indexPath) as! HeaderCell
cell.label.text = header[indexPath.column]
cell.setNeedsLayout()
return cell
} else {
let cell = spreadsheetView.dequeueReusableCell(withReuseIdentifier: String(describing: TextCell.self), for: indexPath) as! TextCell
if indexPath.row < data.count+1{
cell.label.text = data[indexPath.row][indexPath.column]}
return cell
}
}
/// Delegate
func spreadsheetView(_ spreadsheetView: SpreadsheetView, didSelectItemAt indexPath: IndexPath) {
if case 0 = indexPath.row {
if sortedColumn.column == indexPath.column {
sortedColumn.sorting = sortedColumn.sorting == .ascending ? .descending : .ascending
} else {
sortedColumn = (indexPath.column, .ascending)
}
data.sort {
let ascending = $0[sortedColumn.column] < $1[sortedColumn.column]
return sortedColumn.sorting == .ascending ? ascending : !ascending
}
spreadsheetView.reloadData()
}
}
}
解决方案
好的,所以更新。我通过将它链接到我的视图控制器来解决我的第一个问题,但是我遇到了第二个问题。我的新问题是替换旧的 EXC_BAD_ACCESS(code = 2, address=0x1b487d940) 时出错。我认为地址不如代码重要,但我还是把它包括在内。这应该在一个新的职位上发表还是可以留在这里?