我在显示数据时遇到问题。我已经从https://stackoverflow.com/a/39307841/7118403复制了代码,因为我想测试他保存复选标记的方法。但不幸的是,我无法在tableView上显示数据。当我尝试打印“ myItems”时,它显示为[tableViewCheckmark.Item]。我似乎找不到解决方案。 PS。我是编程新手。先感谢您。

class Item {

    let name : String
    var selected = false

    init(name: String) {
        self.name = name
    }
}

class TableViewController: UITableViewController {

    @IBOutlet var uiTableView: UITableView!

    var myItems = [Item]()

    override func viewDidLoad() {

        uiTableView.reloadData()

    }

    override func viewWillAppear(_ animated: Bool) {

        let item = Item(name:"Foo")

        myItems.append(item)
        print(myItems)
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath)
        let item = myItems[indexPath.row]
        cell.textLabel!.text = item.name
        cell.accessoryType = item.selected ? .checkmark : .none
        cell.selectionStyle = .none
        cell.tintColor = UIColor.green

        return cell
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        saveDefaults()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return myItems.count
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let item = myItems[indexPath.row]
        item.selected = true
        tableView.reloadRows(at: [indexPath as IndexPath], with: .none)
    }

    func saveDefaults() {
        let selectedCells = myItems.filter { $0.selected }.map { $0.name }
        let defaults = UserDefaults.standard
        defaults.set(selectedCells, forKey:"selectedCells")
    }

    func readDefaults()
    {
        let defaults = UserDefaults.standard
        let selectedItems = defaults.stringArray(forKey: "selectedCells")!
        for item in myItems {
            item.selected = selectedItems.contains(item.name)
        }
        tableView.reloadData()
    }
}

最佳答案

UITableViewDataSource方法的签名在Swift 3中已更改,并且您当前正在numberOfSections(in:)中传递数组计数,请将其删除并添加以下方法。

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myItems.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath)
    let item = myItems[indexPath.row]
    cell.textLabel!.text = item.name
    cell.accessoryType = item.selected ? .checkmark : .none
    cell.selectionStyle = .none
    cell.tintColor = UIColor.green
    return cell
}

override func tableView(tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let item = myItems[indexPath.row]
    item.selected = true
    tableView.reloadRows(at: [indexPath], with: .none)
}

关于ios - 无法在uitableview Swift 3类上获取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43779276/

10-12 00:32
查看更多