繁体   English   中英

试图将int从文本字段转换为数组swift 4

[英]Trying to convert an int from a textfield to an array swift 4

我正在开发一个iOS应用程序,试图使用文本字段和按钮将整数提交到数组中,以便可以使用“ userdefaults”将其存储。 到目前为止,我有一个不同的文本字段,将输入的String添加到数组中并将其存储在用户默认值中。

     @IBAction func workBtn(_ sender: Any)
{
    let kidnum: Int = Int(enteredScore.text!)!
    kidName.append(enteredName.text!)
    kidScore.append(kidnum)

    enteredName.text?.removeAll()
    enteredScore.text?.removeAll()
}


@IBAction func finishBtn(_ sender: Any)
{
    let userDefaults = UserDefaults.standard
    userDefaults.set(kidName, forKey: "Pupil Name")
    userDefaults.set(kidScore, forKey: "Pupil Score")

    userDefaults.synchronize()
}

workBtn是我正在使用的添加按钮,我也尝试使用字符串,因为我实际上并不需要整数来计算,而只是显示一个分数,但我无法保存它,我正在通过它显示在表格视图控制器单元上。 谢谢

我正在使用Xcode 9.1 Swift 4,谢谢。

编辑***运行它后,在标有“线程1:致命错误:解开可选值时意外发现nil”的行上,此函数出现错误

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let userDefaults = UserDefaults.standard
    var nameArray: [String] = userDefaults.object(forKey:"Pupil Name") as! [String]
    //Error occurring on next line.
    var scoreArray: [Int] = userDefaults.object(forKey: "Pupil Score") as! [Int]

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = "\(nameArray[indexPath.item]) -Score: \(scoreArray[indexPath.item])"

    userDefaults.synchronize()

    return cell
}

您收到的错误意味着您正在某个意外的地方访问nil值。 这很可能是通过强制展开一些在代码中不断执行的值来实现的。 尝试避免使用! 在您的代码中,可能是let kidnum: Int = Int(enteredScore.text!)!类的任何行let kidnum: Int = Int(enteredScore.text!)! 但也可能是某些字段缺少连接,例如,它声明为@IBOutlet weak var enteredName: UITextField! 不幸的是,这是默认设置。

要调试此功能,您可能需要启用异常断点:在Xcode左侧顶部的导航器中,有一个断点图标(项目符号)。 选择它,然后在左下方检查并找到一个“ +”按钮,按下它并选择“ Exception breakpoint ...”。 然后,只需单击即可。 现在,只要遇到像您这样的异常,您的执行就会停止。 运行您的项目,找到行,对象为nil,不应为n。 然后解决您的问题。

但通常,尝试编写代码的方式如下:

    @IBOutlet private weak var scoreTextField: UITextField?
    @IBOutlet private weak var nameTextField: UITextField?

    private typealias NameScore = (name: String, score: Int)
    private var dataArray: [NameScore] = [NameScore]()

    override func viewDidLoad() {
        super.viewDidLoad()
        loadData()
    }

    @IBAction private func workPressed() {
        let scoreValue: Int? = {
            guard let string = scoreTextField?.text, let integer = Int(string) else {
                return nil
            }
            return integer
        }()

        guard let score = scoreValue else {
            print("Could not parse integer value") // TODO: Show alert view
            return
        }

        guard let name = nameTextField?.text else {
            print("Name was not provided") // TODO: Show alert view
            return
        }

        dataArray.append((name: name, score: score))

        // Clear text fields
        scoreTextField?.text = nil
        nameTextField?.text = nil
    }


    @IBAction private func finishPressed() {
        saveData()
    }

    private let pupilNameKey: String = "name"
    private let pupilScoreKey: String = "score"
    private let pupilDataKey: String = "pupil_data"

    private func saveData() {
        // Let's convert data into something that makes more sense for safety
        let dataToSave: [[String: Any]] = dataArray.map { object in
            return [pupilNameKey: object.name,
                    pupilScoreKey: object.score]
        }

        UserDefaults.standard.set(dataToSave, forKey: pupilDataKey)
        UserDefaults.standard.synchronize()
    }

    private func loadData() {
        guard let savedData = UserDefaults.standard.value(forKey: pupilDataKey) as? [[String: Any]] else {
            // No saved data or incorrect format
            return
        }

        dataArray = savedData.flatMap { descriptor in
            guard let name = descriptor[pupilNameKey] as? String, let score = descriptor[pupilScoreKey] as? Int else {
                return nil // Could not parse this object
            }
            return (name: name, score: score)
        }
    }

和表视图:

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let dataObject = dataArray[indexPath.row]
        cell.textLabel?.text = "\(dataObject.name) -Score: \(dataObject.score)"
        return cell
    }

我希望代码能说明如何避免强制展开以及如何打包数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM