我试图在我的应用程序中实现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
}
}
答案 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中具有此控制器。但是您可以像
一样初始化ExerciseVCvar alert:ExerciseVC = ExerciseVC()
这是不正确的,因为在这种情况下,永远不会调用IBAction方法。尝试使用
let storyboard = UIStoryboard(name: "YourStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "yourViewControllerID")