ViewController 完成时不传递数据

ViewController doesn't pass data on completion

我有 2 个 ViewController。

TimerViewController 将变量传递给 EditTimerViewConroller。 EditTimerViewConroller 对其进行编辑并应将其传回,但看起来 .completion 中的代码未执行。

有什么解决方法的建议吗?

我的代码是:

TimerViewController

import UIKit
import AVFoundation //play sounds

class TimerViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()   
    }
    
    var player: AVAudioPlayer!
    var timer = Timer()
    var totalTime = 10.0
    var secondsRemaining = 10.0
    var secondsPassed = 0.0
    let timerStep = 0.1

    @IBOutlet weak var timerLabel: UILabel!
    
    
    @IBOutlet weak var progressBar: UIProgressView!
    
    @IBAction func startPressed(_ sender: UIButton) {
        //works fine
    }
    
    @IBAction func editTimerButtinPresed(_ sender: UIButton) {
        self.performSegue(withIdentifier: "goToEditTimer", sender: self)
        
        let editTimer = EditTimerViewController()
        editTimer.completion = { [weak self] duration in
            DispatchQueue.main.async {
                self?.totalTime = Double(duration!)
                print("editTimer completed, totalTime now is \(self?.totalTime)")
            }
        }
    }
    
    func playSound(fileName: String) {
        //works fine
    }
    
    @objc func updateTimer() {
        //works fine
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToEditTimer" {
            let destinationVC = segue.destination as! EditTimerViewController
            destinationVC.duration = Int(totalTime)
            print("Pasing duration = \(totalTime) to Edit screen")
        }
    }

EditTimerViewController

import UIKit

class EditTimerViewController: UIViewController {
    
    let maxDuration = 60
    var duration: Int? //timer duraton is passed from Timer
    public var completion: ((Int?) -> Void)?

    override func viewDidLoad() {
        super.viewDidLoad()
        durationSlider.minimumValue = 0
        durationSlider.maximumValue = Float(maxDuration)
        durationSlider.value = Float(duration!)
        
        durationLabel.text = String(duration!) + "s"
        }
    
    @IBOutlet weak var durationLabel: UILabel!
    @IBOutlet weak var durationSlider: UISlider!
    
    @IBAction func durationSliderChanged(_ sender: UISlider) {
        duration = Int(sender.value)
        print(duration!)
        durationLabel.text = String(duration!) + "s"
    }
    
    @IBAction func cancelPressed(_ sender: UIButton) {
        print("Cancel pressed, dismissing Edit screen")
        self.dismiss(animated: true, completion: nil)
    }
    
    @IBAction func savePressed(_ sender: UIButton) {
        print("Save pressed, duration is \(duration!)")
        completion?(duration!)
        self.dismiss(animated: true, completion: nil)

    }
}

在按下“保存”按钮后的输出中我看到了

Save pressed, duration is 11

但是后面没有

的迹象
editTimer completed, totalTime now is 11

并且计时器持续时间永远不会改变

改变

@IBAction func editTimerButtinPresed(_ sender: UIButton) {
    self.performSegue(withIdentifier: "goToEditTimer", sender: self)
    
    let editTimer = EditTimerViewController()
    editTimer.completion = { [weak self] duration in
        DispatchQueue.main.async {
            self?.totalTime = Double(duration!)
            print("editTimer completed, totalTime now is \(self?.totalTime)")
        }
    }
}

@IBAction func editTimerButtinPresed(_ sender: UIButton) {
    self.performSegue(withIdentifier: "goToEditTimer", sender: self) 
}

并在 prepare 中移动完成

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToEditTimer" {
        let destinationVC = segue.destination as! EditTimerViewController
        destinationVC.duration = Int(totalTime)
        print("Pasing duration = \(totalTime) to Edit screen")
        destinationVC.completion = { [weak self] duration in
            DispatchQueue.main.async {
                self?.totalTime = Double(duration!)
                print("editTimer completed, totalTime now is \ (self?.totalTime)")
            }
         }
     }
}