提问者:小点点

为什么我的财产和网点在执行了一个分居之后变成零?


我正在学习Swift,目前在一个项目中使用两个ViewControllers。 第一控制器初始化数据并执行对第二控制器的切换。 第二个ViewController将一个新值添加到从第一个ViewController传入的变量中。 但是,当我取消segue并尝试更新第一个segue时,所有IBOutlet属性和变量突然变为nil。 这是通过记录FirstViewController的updateViewController()方法中的属性派生的。 提前谢谢你。

第一视图控制器

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {


    // Date Label
    @IBOutlet weak var dateLabel: UILabel!

    // Progress Bar
    @IBOutlet weak var progressBar: UIProgressView?

    // Progress Label
    @IBOutlet weak var progressLabel: UILabel!

    // Button Collection View
    @IBOutlet weak var collectionView: UICollectionView!

    // Current goal button
    @IBOutlet weak var currentGoal: UIButton!

    // Goal label
    @IBOutlet weak var goalLabel: UILabel!

    // Variable Initialization

    // Initialize daily water goal
    var dailyGoal = Float(20)

    // Initialize current progress
    var currentProgress = Float()

    // Water counter variable
    var waterDrank = Float(0)

    var percentageProgress = Float(0.0)

    override func viewDidLoad() {
        super.viewDidLoad()

    progressBar?.setProgress(0.0, animated: false)
        progressBar!.transform = progressBar!.transform.scaledBy(x: 1, y: 3)

    }

    // MARK: - Button & Progress View Logic

    func addProgress(amount: Float) {

        // Add amount to the total amount drank
        waterDrank += amount
        print(waterDrank)

        // Get the current progress in relation to the daily goal
        let currentProgress = waterDrank / dailyGoal
        // Set the new progress to the progressBar
        progressBar?.setProgress(currentProgress, animated: true)

        // Check if progress is below 0

        if (dailyGoal - waterDrank) <= 0.0 {
        // done
        }

        // Check if the daily goal has already been achieved
        if waterDrank >= Float(dailyGoal) {

            // Daily goal has been achieved - show message & abort code
            showAlert(title: "done", message: "!!")

            return

        }

    }

        // MARK: - Segue Action

    // Segue button to second view controller
    @IBAction func changeGoal(_ sender: Any) {

        performSegue(withIdentifier: "currentGoal", sender: self)

    }

    // Save variables
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        let secondViewController = segue.destination as! SecondViewController
        secondViewController.dailyGoal = self.dailyGoal

    }

    func updateViewController() {

        // Log new daily goal
        print(dailyGoal)

        // Print progressBar object
        print(waterDrank) // is 0, despite waterDrank having been increased in value before performing segue

        print(progressBar?.progress) // is nil, despite having not been nil before performing segue

    }



}

第二视图控制器

    // Current goal label
    @IBOutlet weak var currentGoal: UILabel!

    // Goal picker
    @IBOutlet weak var goalPicker: UIPickerView!


    var dailyGoal = Float()

    let newDailyGoal = [Int()]

    // Initialize current progress
    var currentProgress = Float()

    // Water counter variable
    var waterDrank = Float(0)

    var percentageProgress = Float(0.0)

    override func viewDidLoad() {
        super.viewDidLoad()

    // setting secondViewController as delegate & data source for the UIPicker
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        let vc = ViewController()
        let newDailyGoal = [1500, 1750, 2000, 2250, 2500]
        // Consider row

            switch row {

            case 0:
                self.dailyGoal = Float(newDailyGoal[0])
                vc.dailyGoal = self.dailyGoal

            case 1:
                self.dailyGoal = Float(newDailyGoal[1])
                vc.dailyGoal = self.dailyGoal

            case 2:
                self.dailyGoal = Float(newDailyGoal[2])
                vc.dailyGoal = self.dailyGoal

            case 3:
                self.dailyGoal = Float(newDailyGoal[3])
                vc.dailyGoal = self.dailyGoal

            case 4:
                self.dailyGoal = Float(newDailyGoal[4])
                vc.dailyGoal = self.dailyGoal

            default:

                print("daily goal is default: \(dailyGoal)")

            }


        // Export to ViewController.swift
        return "\(Int(dailyGoal)) ml"

    }

    // MARK: - Save button segue logic

    @IBAction func doneButton(_ sender: Any) {

        dismiss(animated: true, completion: nil)
        let firstViewController = ViewController()
        firstViewController.updateViewController()

    }

}


共1个答案

匿名用户

您的方案要求您将ViewController实例传递给SecondViewController,而不是像这里所做的那样创建一个新实例。 然后在done按钮操作中调用函数UpdateViewController。 所以这里是你需要更新的内容。

在ViewController中:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let secondViewController = segue.destination as! SecondViewController
    secondViewController.dailyGoal      = dailyGoal
    secondViewController.viewController = self
}

在SecondViewController中:

class SecondViewController: UIViewController {
    weak var viewController: ViewController?
...

    @IBAction func doneButton(_ sender: Any) {
        dismiss(animated: true)
        viewController?.updateViewController()
    }
}