我有一个问题,我解释一下。
我想激活一个Switch,可以在tableView中打开该应用程序。
为此,我将标签保存在NSUserDefault中,如果应用程序的打开标签位于NSUserDefailt中,则会激活该开关。
问题是,在下面的图片中,我只是打开开关A和B,但当我scrool其他开关激活为q,s,c但从不相同。
你有想法建议我吗? 我,但我的代码在控制台下面。
ViewController:
@IBOutlet weak var tableView_t: UITableView!
let station = ["A","B","C","D","E","F","G","H","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","&","é","("]
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as? TableViewCell
cell?.configCell(station[indexPath.item])
return cell!
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return station.count
}
TableViewCell:
@IBOutlet weak var switch_t: UISwitch!
@IBOutlet weak var label_t: UILabel!
func configCell(_ labels : String)
{
label_t.text = labels
if let sav = UserDefaults.standard.value(forKey: "switch") as? [String]
{
print(sav)
for switchs in sav
{
print(switchs)
if switchs == labels
{
switch_t.setOn(true, animated: false)
print("On")
}
}
}
}
@IBAction func actionSwitch(_ sender: Any)
{
var sav : [String] = []
if let saving = UserDefaults.standard.value(forKey: "switch") as? [String]
{
sav = saving
}
if switch_t.isOn
{
sav.append(label_t.text!)
UserDefaults.standard.set(sav, forKey: "switch")
print(sav)
}
else
{
var number = 0
for s in sav
{
if s == label_t.text
{
sav.remove(at: number)
UserDefaults.standard.set(sav, forKey: "switch")
}
number += 1
print(sav)
}
}
}
控制台:
[“A”,“B”] 一个 上 乙 [“A”,“B”] 一个 乙 上 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙 [“A”,“B”] 一个 乙
答案 0 :(得分:0)
细胞被重复使用。您必须始终为每个条件设置单元格的属性,以便为每个索引路径完全设置单元格。您的代码仅处理打开单元格的开关,但不关闭。
有两种解决方案。
configCell
方法,以便在任何不应该开启的情况下关闭开关。prepareForReuse
方法。在此方法中,您应该重置单元格的所有状态。这包括将开关设置为关闭并清除标签的文本。另外,您的代码还有其他一些应该清理的小问题。
UserDefaults
使用键值编码,除非您有明确的需要这样做。使用正确的方法保存和读取UserDefaults
。cellForRowAt
中,您应该将单元格强制转换为所需类型。这使得该方法中的其余代码更容易编写,如果转换错误,您希望应用程序快速崩溃,因为这意味着您需要修复编程错误。configCell
方法的参数称为labels
,但它只会悔改一个标签。给它一个复数名称会让人感到困惑。contains
。{/ li>的Array
方法
UserDefaults
的代码比实际需要的更复杂。item
的{{1}}属性。这意味着与IndexPath
一起使用。对于UICollectionView
,请使用UITableView
。以下是我在解决所有上述问题后编写代码的方法。
表格控制器:
row
单元格代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
cell.configCell(station[indexPath.row])
return cell
}
答案 1 :(得分:0)
因为当标签不在UserDefault中时,您永远不会关闭开关。请尝试
switch_t.setOn(false, animated: false)
在适当的地方。
答案 2 :(得分:0)
你需要明确iOS并没有为每一行创建新的Cell,它只是一次又一次地重复使用1个Cell,确保在显示下一个单元格之前你的开关是On或Off其他明智的相同状态将应用于其他..在您的情况下,当单元格即将显示时,您永远不会关闭开关
root