我正在从api获取项目,并且想将它们与数组进行比较
例如:获取了items = [1,2,3,4]
我想找到项目[1,2]
。
并要在tableView
上设置复选标记
在cellForRowAt()
我用过这个
if(alreadySelectedItems.count != 0) {
if(dataModel.contains(alreadySelectedItems[indexPath.row])){
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
}
和
if(alreadySelectedItems.count != 0) {
if(dataModel[indexPath.row] == alreadySelectedItems[indexPath.row]) {
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
}
dataModel
是api的项目列表,而alreadySelecteditems
是我的selectedItems
我得到
错误:索引超出范围
这是我的tableView扩展功能
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return dataModel.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! CheckableTableViewCell
cell.dataModel = dataModel[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
selectedItems.append(dataModel[indexPath.row])
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)
{
selectedItems.removeObject(object: dataModel[indexPath.row])
}
单元格是:
class CheckableTableViewCell: UITableViewCell
{
var dataModel : String?
{
didSet
{
guard let model = dataModel else {return}
textLabel?.text = model
}
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = .none
self.tintColor = .primaryColor
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
}
override func setSelected(_ selected: Bool, animated: Bool)
{
super.setSelected(selected, animated: animated)
self.accessoryType = selected ? .checkmark : .none
}
}
答案 0 :(得分:1)
在您的代码中,您正在检查selectedItems[indexPath.row]
中dataModel
的存在,即
dataModel.contains(selectedItems[indexPath.row])
相反,必须相反,即
selectedItems.contains(dataModel[indexPath.row])
这就是它给Index Out of Bounds
例外的原因。
只需将tableView(_:cellForRowAt:)
的定义更改为
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CheckableTableViewCell
let dataModel = self.dataModel[indexPath.row]
cell.dataModel = dataModel
cell.accessoryType = self.selectedItems.contains(dataModel) ? .checkmark : .none //here..........
return cell
}
答案 1 :(得分:0)
您可以使用此扩展名来查找数组中的相同元素
extension Array where Element: Hashable {
func sameElements(from other: [Element]) -> [Element] {
let firstSet = Set(self)
let otherSet = Set(other)
return Array(firstSet.intersection(otherSet))
}
}