如何实用地创建IBOutlet集合(swift4)

时间:2018-09-20 01:17:42

标签: ios swift4 nslayoutconstraint iboutletcollection

我试图使用插座集合将所有文本字段的总数相加,因此问题以编程方式放置在所有文本字段中,因此我无法将其拖放到集合中。如何以编程方式执行此操作?您可以看到我正在尝试执行的操作,但这正在导致编译错误。

var a28 = UITextField()
var a29 = UITextField()
    @objc func hitA31(_ textField: UITextField) {

    var fullTotal = 0
    for view in a28,a29 {
        if let text = view.text, let num = Int(text) {
            fullTotal += num

        }
    }
    a31.text = String(fullTotal)
}

3 个答案:

答案 0 :(得分:0)

您可以像这样遍历所有子视图:

func hitA31() {
    var fullTotal = 0
    for case let textField as UITextField in view.subviews {
        // You can add validation if the textField is only for a28 and a29
        if let text = textField.text, let num = Int(text) {
            fullTotal += num
        }
    }
    a31.text = String(fullTotal)
}

答案 1 :(得分:0)

IBOutlet集合只是一个数组。没什么特别的。

let textFields = [a28, a29]

for view in textFields {
}

let fullTotal = [a28, a29]
  .compactMap { Int($0.text ?? "") }
  .reduce(0, +)

答案 2 :(得分:-1)

 lazy var textFileds : [UITextField] = {
        var temptextField: [UITextField] = []
        for v:AnyObject in self.view.subviews {
            if v is UITextField {
                temptextField.append(v as! UITextField)
            }
        }
        return temptextField
    }()

...

基本上,它遍历所有子视图并检查是否一个UITextField。在这种情况下,它将被添加到一个临时数组中。然后,该临时数组用于延迟实例化textFileds数组。

当您可以像这样添加总数时,这就是您所有的textFileds

func getFullNumber () {
    var fullNumber = 0
    for txtfield in textFileds {
      let txtString = txtfield.text ?? ""
      let number = Int(txtString) ?? 0
      fullNumber += number
    }
    a31.text = String(fullNumber)
}