首页 > 解决方案 > 我无法弄清楚我在 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()

        }

    }

}

标签: swift

解决方案


好的,所以更新。我通过将它链接到我的视图控制器来解决我的第一个问题,但是我遇到了第二个问题。我的新问题是替换旧的 EXC_BAD_ACCESS(code = 2, address=0x1b487d940) 时出错。我认为地址不如代码重要,但我还是把它包括在内。这应该在一个新的职位上发表还是可以留在这里?


推荐阅读