在 Swift 4 中输入文本字段时的进度条填充百分比

Progress bar to fill percentage when textfields are entered in Swift 4

我正在制作一个用于学习目的的应用程序,它具有静态单元格,并且在视图顶部有一个进度条,我想从零开始。当他们填写所有字段时,它会完成进度条,然后会出现一个按钮,提示保存。我认为这种方式会奏效。

import UIKit

class TableViewController: UITableViewController {


    @IBOutlet var infoProgressBar: UIProgressView!
    //all labels for adjusting same space
    @IBOutlet var labels: [UILabel]!

    //textfields for progress
    @IBOutlet var infoTextFields: [UITextField]! {
        didSet{
            infoProgressBar.setProgress(progress, animated: true)
        }
    }


    //progress bar code
    var progress:Float {
        if textFieldProgress(count: true) {
            return Float(infoTextFields) / Float(infoTextFields)
        } else {
            return 0
        }
    }

    //function to check if there is info in textfields
    func textFieldProgress(count: Bool) -> Bool {
        if infoTextFields?.isEmpty ?? true {
            return true
        } else {
            return false
        }
    }

}

我已将所有文本字段链接到 infoTextFields。如果我将 bool 函数 return 设置为 false,则进度条会立即完成。如果我将它设置为 false,它会从一半变为零并且永远不会回来。

这是我的看法

我不确定这是否是您要查找的内容,但您可以对每个文本字段使用 UITextFieldDelegate 方法 textFieldDidEndEditing,如果文本字段不为空,则增加进度条的宽度。

您可以使用 reduce 来检查有多少字段为空并除以文本字段的总数:

var progress: Float {
    return Float(infoTextFields.reduce(0) { .text?.isEmpty == true ? [=10=] : [=10=]+1}) / Float(infoTextFields.count)
}

您需要将目标添加到文本字段以编辑更改的控件事件,因为当您更改文本字段的文本 属性 时不会调用 didSet。

@IBOutlet var infoTextFields: [UITextField]!
@objc func editingChanged(_ textField: UITextField) {
    infoProgressBar.setProgress(progress, animated: true)
}
override func viewDidLoad() {
    super.viewDidLoad()
    infoTextFields.forEach({
        [=11=].addTarget(self, action: #selector(editingChanged), for: .editingChanged)
    })
}