快速的视图控制器之间的代表

时间:2020-02-29 17:27:16

标签: ios swift delegates

我试图在我的应用程序中实现2个视图控制器之间的委托,以便在其中一个中重新加载tableView数据,但是当我按下按钮时什么都没发生,我已经用断点对其进行了测试,我是否忘记了我的实现?

发送ViewController

     protocol UpdateDelegate {
            func updateExerciseCells()
        }

        class ExerciseVC: UIViewController {


            var delegate:UpdateDelegate?


           @IBAction func saveWorkoutPressed(_ sender: Any) {

                exercise = Exercise(name: exerciseNameInput.text!, weight: weightInput.text!, reps: repsInput.text!, sets: setsInput.text!, difficulty: "")

                WorkoutService.instance.exercises.append(exercise!)


                self.delegate?.updateExerciseCells()

                dismiss(animated: true, completion: nil)

            }
}

接收ViewController

class WorkoutVC: UIViewController, UpdateDelegate {

    var alert:ExerciseVC = ExerciseVC()




    override func viewDidLoad() {
        super.viewDidLoad()
        alert.delegate = self
    }

 func updateExerciseCells() {
        //update table
    }

}

2 个答案:

答案 0 :(得分:3)

这里发生的事情是您正在以编程方式创建ExerciseVC,但是您的Main.storyboard正在通过segue创建另一个。因此,delegate与由segue创建的那一个无效。

将此功能添加到您的WorkoutVC

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? ExerciseVC {
        vc.delegate = self
    }
}

您可以删除alert中的WorkoutVC变量,并且将由UIStoryBoard实例化对该变量的引用,因为您将使用该变量。

答案 1 :(得分:0)

根据您的代码,您在类ExerciseVC中使用IBAction方法,这意味着您在Storyboard中具有此控制器。但是您可以像

一样初始化ExerciseVC
var alert:ExerciseVC = ExerciseVC()

这是不正确的,因为在这种情况下,永远不会调用IBAction方法。尝试使用

let storyboard = UIStoryboard(name: "YourStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "yourViewControllerID")