使用UserDefaults切换到tableview,其中几个被激活

时间:2017-08-21 21:00:26

标签: ios swift uitableview nsuserdefaults uiswitch

我有一个问题,我解释一下。

我想激活一个Switch,可以在tableView中打开该应用程序。

为此,我将标签保存在NSUserDefault中,如果应用程序的打开标签位于NSUserDefailt中,则会激活该开关。

问题是,在下面的图片中,我只是打开开关A和B,但当我scrool其他开关激活为q,s,c但从不相同。

你有想法建议我吗? 我,但我的代码在控制台下面。

Screen 1

Screen 2

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”]   一个   乙

3 个答案:

答案 0 :(得分:0)

细胞被重复使用。您必须始终为每个条件设置单元格的属性,以便为每个索引路径完全设置单元格。您的代码仅处理打开单元格的开关,但不关闭。

有两种解决方案。

  1. 更新您的configCell方法,以便在任何不应该开启的情况下关闭开关。
  2. 覆盖单元格的prepareForReuse方法。在此方法中,您应该重置单元格的所有状态。这包括将开关设置为关闭并清除标签的文本。
  3. 另外,您的代码还有其他一些应该清理的小问题。

    1. 不要对UserDefaults使用键值编码,除非您有明确的需要这样做。使用正确的方法保存和读取UserDefaults
    2. 中的值
    3. 在您的cellForRowAt中,您应该将单元格强制转换为所需类型。这使得该方法中的其余代码更容易编写,如果转换错误,您希望应用程序快速崩溃,因为这意味着您需要修复编程错误。
    4. 次要 - configCell方法的参数称为labels,但它只会悔改一个标签。给它一个复数名称会让人感到困惑。
    5. 检查单元的开关是否应该打开的逻辑远比它需要的复杂得多。使用contains。{/ li>的Array方法
    6. 您更新UserDefaults的代码比实际需要的更复杂。
    7. 您正在引用item的{​​{1}}属性。这意味着与IndexPath一起使用。对于UICollectionView,请使用UITableView
    8. 以下是我在解决所有上述问题后编写代码的方法。

      表格控制器:

      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