【问题标题】:Append Array with UserDefaults input text使用 UserDefaults 输入文本附加数组
【发布时间】:2017-12-24 23:16:28
【问题描述】:

我有一个字符串数组,它正在填充一个集合视图并且效果很好。问题是我想用保存在用户输入文本字段中的用户默认值中的字符串附加该数组。我正在获取 UserDefault 数据,问题是它没有显示在单独的集合视图单元格中。它附加在当前单元格中每个字符串的末尾。在此先感谢,任何帮助将不胜感激。

这是我迄今为止尝试过的:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell

    let defaults = UserDefaults.standard
    let value = defaults.string(forKey: "Gratitude")
    print(value!)
    //Array that I am trying to append with userdefault data       
    gratitudeArray.append(value!)

    // Configure the cell
    cell.cellLabel.text = gratitudeArray[indexPath.row]
    return cell
}

// 我正在从警报中获取用户输入并保存在 userdefaults 中,如下所示:

func presentAlert() { let alertController = UIAlertController(title: "", message: "Create your own Gratitude:", preferredStyle: .alert)

    let confirmAction = UIAlertAction(title: "Save", style: .default) { (_) in
        if let field = alertController.textFields?[0] {
            // store data
            UserDefaults.standard.set(field.text, forKey: "Gratitude")
            UserDefaults.standard.synchronize()
        } else {
            print()
        }
    }

    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in }

    alertController.addTextField { (textField) in
        //print(textField.text!)
        //textField.placeholder = ""
    }

    alertController.addAction(confirmAction)
    alertController.addAction(cancelAction)

    self.present(alertController, animated: true, completion: nil)
}

【问题讨论】:

  • 这是因为您将gratitudeArray 元素附加到您已经定义用于将元素存储在collectionView 中的同一单元格中
  • 无论您从UserDefaults 获得什么,都做一件事,将其附加到您之前用于填充collectionView 单元格的同一数组中
  • 你想在单元格中显示什么? "gratitudeArray[indexPath.row] + value" 或 "gratitudeArray + value"
  • @ Samarth Kejriwal 感谢您的回复,这就是我想要做的,但它没有显示在集合视图的新单元格中。它正在连接到当前单元格的末尾
  • @JD 我想在单独的单元格中显示感谢和 userDefaults 的值

标签: arrays swift swift3 nsuserdefaults


【解决方案1】:

在 ViewDidLoad() 中存储字符串,如下所示:

var strValue: String = ""

override func viewDidLoad() {
    super.viewDidLoad()

    let defaults = UserDefaults.standard
    strValue= defaults.string(forKey: "Gratitude")
}

并像这样在 cellForItemAt 中显示:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
    cell.cellLabel.text = gratitudeArray[indexPath.row] + " " + strValue
    return cell
}

【讨论】:

  • 感谢您的回复,但我得到了相同的结果。附加值未显示在不同/单独的单元格中,它附加到当前单元格的末尾。
【解决方案2】:

如果我正确理解您的问题,您希望单元格的数量增加一(您从 UserDefaults 中提取的值)。为此,您应该将其附加到集合视图的数据源方法之外的某个位置(例如 viewDidLoad()),然后重新加载您的集合视图。

override func viewDidLoad() {
    super.viewDidLoad()

    let defaults = UserDefaults.standard
    strValue = defaults.string(forKey: "Gratitude")
    gratitudeArray.append(strValue)
    self.collectionView.reloadData()
}

【讨论】:

  • 是的,这就是我想要做的,我使用了你的建议,但它只增加了一个单元格。每当我在 userdefaults 中输入更多文本时,它都会替换当前单元格中的文本。而不是添加另一个单元格来显示新数据。
  • 您能否提供更多详细信息,例如您何时/何地从用户那里获取数据,以及您希望它何时反映在 UI 上作为您的 collectionview 中的一个附加字段?如果您要在用户输入屏幕和集合视图屏幕之间来回切换,并且想要保留用户输入的每个数据,那么您需要将整个字符串数组保留在用户默认值中(或任何持久性,如 sqllite),而不是单个字符串.每次用户输入时,您都会在数组中追加,并持久化数组。然后当你想在collectionview中显示它时从UserDefaults中获取整个数组
  • @Vaidhav Misra 感谢您的回复,我正在使用警报文本字段来获取用户输入。我用代码更新了我的问题。
  • 很高兴为您提供帮助。关键是您需要在从用户那里获得输入后将 append() 调用添加到您的数组中。在您的情况下,这可能在 UIAlertAction 的完成块中,并在追加后在您的 collectionview 上调用 reloadData() 。然后,如果您希望下次加载屏幕时显示更新的数组,则需要确保整个数组被持久化以防它被释放(比如弹出视图)
  • UIAlertAction 位于单独的 ViewController 上,所以我必须创建一个数组来保存用户 textInput 并将该数组保存到用户默认值?
【解决方案3】:

我通过在我的警报控制器中创建一个数组来保存用户输入,然后将该数组保存为用户默认值,从而解决了这个问题。

func presentAlert() { let alertController = UIAlertController(title: "", message: "Create your own Gratitude:", preferredStyle: .alert)

    let confirmAction = UIAlertAction(title: "Save", style: .default) { (_) in
        if let field = alertController.textFields {

            let textFieldArray = field as [UITextField]
            let text = textFieldArray[0].text

            let key = "Gratitude"

            var myArray = UserDefaults.standard.array(forKey: key) ?? []
            myArray.append(String(describing: text!))
            UserDefaults.standard.set(myArray, forKey: key)

            print(myArray)


        } else {
            print()
        }
    }

    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in }

    alertController.addTextField { (textField) in

    }

    alertController.addAction(confirmAction)
    alertController.addAction(cancelAction)

    self.present(alertController, animated: true, completion: nil)
}

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2020-03-12
    • 2019-09-15
    • 2018-06-16
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多