【问题标题】:Progress bar to fill percentage when textfields are entered in Swift 4在 Swift 4 中输入文本字段时填充百分比的进度条
【发布时间】:2017-12-30 05:02:16
【问题描述】:

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

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 函数返回 false 进度条立即完成。如果我将它设置为 false,它会从一半变为零并且永远不会回来。

这是我的看法

【问题讨论】:

    标签: swift view boolean progress


    【解决方案1】:

    您可以使用reduce来检查有多少字段是空的,然后除以文本字段的总数:

    var progress: Float {
        return Float(infoTextFields.reduce(0) { $1.text?.isEmpty == true ? $0 : $0+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({
            $0.addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        })
    }
    

    【讨论】:

    • 这对我不起作用。无论我填写多少,它仍然保持进度条为0
    • @BlueMoose 检查我的编辑。您还可以使用相同的方法在文本更改时检查密码(再次)字段是否与密码字段匹配,以及您可能需要执行的任何验证。
    • 成功了,谢谢!只是想知道我的方法是否可以制作一个 bool func 来查找它是否为空白。原因是你刚刚添加的所有内容我还不明白
    • Float(infoTextFields) / Float(infoTextFields) 这是错误的。您正在将一个数组传递给 Float 初始化程序,它甚至不会按原样编译。而textFieldProgress(count: true) 你总是传递真实的方法我不知道你的意思是什么。用户可以随时删除归档的内容。
    • 好吧,我会使用你给我的东西,并尝试更多地了解它。感谢您的帮助!
    【解决方案2】:

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

    【讨论】:

    • 我添加了代理。如何将 didediting 附加到出口文本字段?
    • 添加 UITextFeildDelegate 后,调用方法 func textFieldDidEndEditing(_ textField: UITextField) { // 你的代码在这里 }
    • 我相信该方法适用于所有文本字段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多