kav*_*004 1 arrays uitableview ios swift
使用表格视图(XCode 9,Swift 4)时,我遇到了一个非常具体的问题。我想做的是,创建一个名为foodDetailInfoArray的数组,并在用户手动选择的表格单元格中使用foodName标签的文本值。目前,虽然.setSelected方法可以根据需要更改单元格的UI,但它并不能帮助我正确记录foodName.text值。问题在于,即使在滚动表视图时也会记录文本值,并且数组值也会被替换。以下是代码和打印输出的示例。
var foodDetailInfoArray: [String] = []
@IBOutlet var unselectedCell: UIView!
@IBOutlet var foodName: UILabel!
@IBOutlet var carbonValue: UILabel!
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
if selected == true {
self.unselectedCell.backgroundColor = UIColor.init(red: 4/255, green: 206/255, blue: 132/255, alpha: 1)
self.foodName.textColor = UIColor.white
self.carbonValue.textColor = UIColor.white
foodDetailInfoArray.append(foodName.text!)
} else {
self.unselectedCell.backgroundColor = UIColor.clear
self.foodName.textColor = UIColor.black
self.carbonValue.textColor = UIColor.black
}
print(foodDetailInfoArray)
}
Run Code Online (Sandbox Code Playgroud)
print语句为我提供了这样的结果:(这是什至没有选择单元格,而我只是滚动表格视图的时候。)
["pepper"]
["pasta"]
["pasta", "pepper"]
["pepper"]
["pepper", "pasta"]
["stir-fry"]
["stir-fry", "stir-fry"]
["vegetable"]
["vegetable", "vegetable"]
Run Code Online (Sandbox Code Playgroud)
而我理想的情况是(按一下包含给定foodName的单元格的顺序):
["pasta"]
["pasta", "pepper"]
["pasta", "pepper", "tomato"]
["pasta", "pepper", "tomato", "stir-fry"]
Run Code Online (Sandbox Code Playgroud)
如果取消选择某个单元格,则必须删除该名称,即,如果取消选择tomato,则数组为
["pasta", "pepper", "stir-fry"]
Run Code Online (Sandbox Code Playgroud)
... 等等
PS:我不是专业的程序员,而是最近自学成才,所以请让我知道问题是否仍然不清楚。
didSelectRowAtIndexPath我会尝试的委托方法tableViews。让您的视图控制器采用该UITableViewDelegate协议并实现以下内容。
假设您有一个foods数组,并且一个foodsSelected最初为空的数组。
let foods:[String] = ["Apples","Avocado","Bananas"]
var foodsSelected:[String] = []
Run Code Online (Sandbox Code Playgroud)
现在,每当选择一个单元格时,都会调用此委托方法,并从数组中添加或删除所选食物foodsSelected。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//Check if the selected food is in the foodsSelect array
if(!foodsSelected.contains(foods[indexPath.row])){
//If it's not, append it to the array
foodsSelected.append(foods[indexPath.row])
}else{
//If it is, remove it from the array.
//Note there are many ways to remove an element from an array; I decided to use filter.
foodsSelected = foodsSelected.filter({$0 != foods[indexPath.row]})
}
print(foodsSelected)
}
Run Code Online (Sandbox Code Playgroud)
这是我按顺序选择这些项目时的输出:Apples, Avocado, Bananas,Avocado
["Apples"]
["Apples", "Avocado"]
["Apples", "Avocado", "Bananas"]
["Apples", "Bananas"]
Run Code Online (Sandbox Code Playgroud)
我将通过视图控制器处理单元格的选择和取消选择,因此您也可以foodDetailInfoArray更好地使用它。借助此答案,您可以像这样进行操作:
import UIKit
class ViewController: UITableViewController {
// example data
let names = [ "pepper", "pasta", "stir-fry", "vegetable"]
var foodDetailInfoArray: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
// allow multiselection
tableView.allowsMultipleSelection = true
}
// MARK: UITableViewDataSource
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
cell.textLabel?.text = names[indexPath.row]
// Don't show highlighted state
cell.selectionStyle = .none
return cell
}
// MARK: UITableViewDelegate
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// also do your UI changing for the cell here for selecting
// Add your food detail to the array
foodDetailInfoArray.append(names[indexPath.row])
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
// also do your UI changing for the cell here for deselecting
// Remove your food detail from the array if it exists
if let index = foodDetailInfoArray.index(of: names[indexPath.row]) {
foodDetailInfoArray.remove(at: index)
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果
| 归档时间: |
|
| 查看次数: |
2624 次 |
| 最近记录: |