如何在按下按钮时从数组数据显示iOS表格视图-Swift

问题描述 投票:1回答:1

我有一个数组,试图在按下按钮(导航栏按钮)时填充表格视图。我已经使用打印语句来验证是否存在正确的数据,但是我无法使表行显示在按下按钮时。

我认为问题出在我的@ IBAction func favoritesButton(_ sender:UIBarButtonItem)语法中,但是现在确定如何解决。我想念什么?

class ViewController: UIViewController {

    @IBOutlet weak var searchBar: UISearchBar!

    @IBOutlet weak var tableView: UITableView!

    var materialData = ["One", "Two", "Three", "Four", "Five"]

    override func viewDidLoad() {
        super.viewDidLoad()

        print(favoritesData)

    }

    @IBAction func arrayList(_ sender: UIBarButtonItem) {
        print(favoritesData)
    }

    @IBAction func favoritesButton(_ sender: UIBarButtonItem) {
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
            cell.textLabel?.numberOfLines = 0
            cell.textLabel?.text = favoritesData[indexPath.row]
            print(favoritesData)
            return cell
        }
    }
}

var searchMaterial = [String]()
var searching = false
var favoritesData = [String]()

extension ViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        print(self.materialData[indexPath.row], "selected!")
    }

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

        let favorite = UITableViewRowAction(style: .default, title: "Favorite") { (action, indexPath) in

            var data: String

            if searching {
                data = searchMaterial[indexPath.row]
                print(searchMaterial[indexPath.row], "added to favorites")
            } else {
                data = self.materialData[indexPath.row]
                print(self.materialData[indexPath.row], "added to favorites")
            }
            if let index = favoritesData.firstIndex(of: data) {
                favoritesData.remove(at: index)
            }
            else {
                favoritesData.append(data)
            }

        }
        favorite.backgroundColor = UIColor.orange
        return [favorite]
    }

}

extension ViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if searching {
            return searchMaterial.count
        } else {
            return materialData.count
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.numberOfLines = 0
        if searching {
            cell.textLabel?.text = searchMaterial[indexPath.row]
        } else {
            cell.textLabel?.text = materialData[indexPath.row]
        }
        return cell
    }

}

extension ViewController: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        searchBar.setShowsCancelButton(true, animated: true)
        searchMaterial = materialData.filter({$0.prefix(searchText.count) == searchText})
        searching = true
        tableView.reloadData()
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searchBar.setShowsCancelButton(false, animated: true)
        searching = false
        searchBar.text = ""
        tableView.reloadData()
        tableView.endEditing(true)
    }

}


ios arrays swift button tableview
1个回答
0
投票

不要在按钮操作中写入cellForRow。cellForRowAtIndexPath是dataSource提供给UITableView的方法。 iOS调用它来加载特定indexPath的单元格。它通过dequeueing一个可重复使用的单元格并填充该单元格的信息来工作。

您通常不称呼它。 iOS会这样做

在您的按钮操作中,只需将数据源设置为您的情况,将favoritesData设置为favoritesData = data,然后调用tableView.reloadData()

© www.soinside.com 2019 - 2024. All rights reserved.