想要从所有行获取计算值

时间:2018-04-28 05:49:01

标签: ios objective-c arrays swift xcode

我有一个包含20行以上的表,每行有3个文本字段,分别为Rate,minutes和total。计算如率/ 60 *分钟=总计。我想在另一个文本字段中获得所有20行的总和不是表视图单元格而是视图控制器的一部分。我想实时计算这个值,并在表视图单元格enter image description here下面添加名为Rupees Text字段的总文本字段。我可以看到屏幕上的3行和其他17个下来。我得到的行中只有3个文本字段不是全部。我已经编写了这段代码,但可以计算3行而不是所有20行。请检查提前谢谢。第二个问题我使用通知传递字符串,它发送给我字符串中的最后一个值而不是更新的值。请检查图像

import UIKit

class calculationTVC: UITableViewCell, UITextFieldDelegate{
  var numberOfItems = 0
  var myTV : UITableView!



  @IBOutlet weak var minutes: UITextField!
  @IBOutlet weak var total: UITextField!
  @IBOutlet weak var rate: UITextField!

  @IBAction func rateChanged(_ sender: UITextField) {
    //  print(minutes.text, total.text, rate.text)
    ratesischanged()

  }


  public func ratesischanged(){
    let first = Double(rate.text!)
    let second = Double(minutes.text!)
    let third = Double(0)


    if minutes.text?.count == 0{
      total.text = "\(third)"
    }

    if minutes.text?.count == 0{
      //  print("null")
      total.text = "\(third)"
      //   print("got zero")

    }else{

      let output = Double((first!/60) * second!)
      total.text = "\(output)"

      let rows = myTV.numberOfRows(inSection: 0)
      var add : Double!
      var c = [Int]()

      for i in 0..<rows{

        let path = IndexPath(row: i, section: 0)


        let cell = myTV.cellForRow(at: path) as? calculationTVC



        add = (cell?.total.text as NSString?)?.doubleValue
        //  print(Int(add))
        //print(add)

        if add != nil{

          c += [Int(add)]

          // print(c)

        }

      }


      var sum = 0
      var counter = 0


      // Enter your code below
      while counter < c.count {

        var newValue = c[counter]
        sum += newValue

        counter += 1
        // print(sum, "sum")

      }


      var myString = String(describing: sum)

      NotificationCenter.default.post(name: calculationScreen.notificationName, object: nil, userInfo: ["DataMy": myString ?? ""])
      //print(ar, "new ar")


    }

  }


  func numberOfRows(numberInt : Int,tableView : UITableView){
    numberOfItems = numberInt
    myTV = tableView
  }


}

1 个答案:

答案 0 :(得分:0)

您可以在tableViewCell上定义 协议 ,并在修改每个单元格的UITextField时以及viewController中触发它代表的实施:

protocol TableViewCellDelegate: class {
    func textViewValueChanged(minutes: String, rate: String, total: String)
}

class calculationTVC: UITableViewCell { // delete UITextFieldDelegate
    weak var delegate: TableViewCellDelegate?
    // ... the rest of your code

    @IBAction func textFieldEditingChanged(_ sender: UIButton) { //action of ***Editing Changed*** and connected to all *UITextField*
        //calculate total
        delegate?.textViewValueChanged(minutes: self.minutes, rate: self.rate, total: self.total)
    }
}

class viewController: UIViewController, UITableView, UITableViewDelegate, UITableViewdataSource, TableViewCellDelegate { //and what you want to implement
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: IndexPath) as? calculationTVC
        cell.delegate = self
        // ... the rest of your code
        return cell
    }

    func textViewValueChanged(minutes: String, rate: String, total: String) {
        var total = 0
        for i in 1...20 {
        let cell = tableView.cellForRow(at: i) as? calculationTVC
         total += cell.rate/60 * cell.minutes
        }
        //set your totalLabel
    } 
}