繁体   English   中英

为什么我只能在 swift 5 的表视图中看到数组的最后一个元素?

[英]Why i only see the last element of array in a table view in swift 5?

我有一个如下所示的UI ,当我单击 UI 中的保存按钮时,我想在视图顶部添加三个值到表视图,其中有三个不同的标签来表示它们和一个自定义结构来定义模型。 但我的问题是我只能附加一个元素,但我想要的是将先前添加的元素保留在该数组中并将它们显示在tableView

这是用户界面图像

在此处输入图片说明

这是代码:

主视图控制器.swift

class MainViewController: UIViewController {

    @IBOutlet weak var minDbLabel: UILabel!
    @IBOutlet weak var averageDbLabel: UILabel!
    @IBOutlet weak var maximumDbLabel: UILabel!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "saveRecord" {
            let recordVC = segue.destination as! RecordTableViewController

            recordVC.record.minimumValue = (minDbLabel.text! as NSString).floatValue
            recordVC.record.averageValue = (averageDbLabel.text! as NSString).floatValue
            recordVC.record.maximumValue = (maximumDbLabel.text! as NSString).floatValue

            recordVC.recordsArray.append(recordVC.record)
        }
    }

    @IBAction func save(_ sender: UIButton){
        self.performSegue(withIdentifier: "saveRecord", sender: nil)
    }

}

RecordTableViewController.swift:

class RecordCell: UITableViewCell {
    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet weak var minimumValueLabel: UILabel!
    @IBOutlet weak var averageValueLabel: UILabel!
    @IBOutlet weak var maximumValueLabel: UILabel!
}

class RecordTableViewController: UITableViewController {

    let cellIdentifier: String = "cellID"
    var recordsArray = [Record]()
    var record: Record = Record()

    override var shouldAutorotate: Bool {
        return false
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let swipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight(_:)))
        swipe.direction = .right
        self.view.addGestureRecognizer(swipe)

        tableView.insertRows(at: [IndexPath(row: recordsArray.count - 1, section: 0)], with: .automatic)
        tableView.reloadData()
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return recordsArray.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! RecordCell
        cell.minimumValueLabel.text = "\(recordsArray[indexPath.row].minimumValue)"
        cell.averageValueLabel.text = "\(recordsArray[indexPath.row].averageValue)"
        cell.maximumValueLabel.text = "\(recordsArray[indexPath.row].maximumValue)"
        return cell
    }
}

记录.swift

struct Record {
    var minimumValue: Float = .nan
    var averageValue: Float = .nan
    var maximumValue: Float = .nan
}

提前致谢。

注意:我已经在 Google 上搜索过以找到答案,但无济于事。

在执行转场之前,您应该首先在MainViewController中的recordsArray中附加数据。 看下面的代码

class MainViewController: UIViewController {

 @IBOutlet weak var minDbLabel: UILabel!
    @IBOutlet weak var averageDbLabel: UILabel!
    @IBOutlet weak var maximumDbLabel: UILabel!
    var recordsArray = [Record]()


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "saveRecord" {
            let recordVC = segue.destination as! RecordTableViewController
            var record = Record()
            record.minimumValue = Float(minDbLabel.text!) ?? 0.0
            record.averageValue = Float(averageDbLabel.text!) ?? 0.0
            record.maximumValue = Float(maximumDbLabel.text!) ?? 0.0
            self.recordsArray.append(record)
            recordVC.recordsArray = self.recordsArray
        }
    }

    @IBAction func save(_ sender: UIButton){
        self.performSegue(withIdentifier: "saveRecord", sender: nil)
    }

}

只需用上面的代码替换你的MainViewController就可以了。

暂无
暂无

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

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