我有一个数组,试图在按下按钮(导航栏按钮)时填充表格视图。我已经使用打印语句来验证是否存在正确的数据,但是我无法使表行显示在按下按钮时。
我认为问题出在我的@ 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)
}
}
不要在按钮操作中写入cellForRow
。cellForRowAtIndexPath是dataSource
提供给UITableView
的方法。 iOS调用它来加载特定indexPath的单元格。它通过dequeueing
一个可重复使用的单元格并填充该单元格的信息来工作。
您通常不称呼它。 iOS会这样做
在您的按钮操作中,只需将数据源设置为您的情况,将favoritesData
设置为favoritesData = data
,然后调用tableView.reloadData()