使用委托从模态视图控制器中的另一个视图控制器中调用方法 [英] Calling method in another view controller from modal view controller using a delegate

查看:54
本文介绍了使用委托从模态视图控制器中的另一个视图控制器中调用方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用模式搜索来创建要关闭的视图控制器,然后在原始视图控制器中调用方法。我使用了协议/代理模式,但由于某种原因,从未调用过该方法。代码如下:请注意,我删除了很多无关的代码以保持此处干净

I am using a modal segue to create a view controller that I want to dismiss and then call a method in the origin view controller. I have used a protocol/delegate pattern but for some reason the method is never called. The code is below: Please note that I removed a lot of non-relevant code to keep it clean here

谢谢!

VC1:

final class WorkoutViewController: UIViewController, StartWorkoutButtonDelegate {

weak var dataSource: WorkoutViewControllerDataSource!
private var workout: Workout!
private var workoutDataViewController: WorkoutDataViewController?
private var workoutFinishViewController: WorkoutFinishViewController?
private let workoutFinishViewControllerSegueIdentifier = "Workout Finish View Controller Segue"

@IBOutlet private var primaryActionButton: UIButton!
@IBOutlet private var pageControl: UIPageControl!

// MARK: - Handling View Lifecycle

override func viewDidLoad() {
    super .viewDidLoad()
    let workoutType = dataSource.workoutType(for: self)
    workout = Workout(workoutType: workoutType, managedObjectContext: persistentContainer.viewContext)
    setPrimaryActionButtonLabel()
}

// MARK: - Handling Storyboard Segues

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)

    if let destinationWorkoutFinishViewController = segue.destination as? WorkoutFinishViewController {
        workoutFinishViewController = destinationWorkoutFinishViewController
    }
}

// MARK: - Managing Start and Pause 

@IBAction func startOrPauseWorkout() {
    if workout.isPaused {
        startWorkout()
    } else {
        pauseWorkout()
    }
}

}

VC 2:

protocol StartWorkoutButtonDelegate: AnyObject {
func startOrPauseWorkout()
 }

class WorkoutFinishViewController: UIViewController {

weak var delegate: StartWorkoutButtonDelegate?

@IBAction func startWorkout() {
    self.delegate?.startOrPauseWorkout()
    self.dismiss(animated: true, completion: nil)
}

@IBAction func finishWorkout() {
}

override func viewDidLoad() {
    super.viewDidLoad()

}
}


推荐答案

在这里设置了委托

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

这篇关于使用委托从模态视图控制器中的另一个视图控制器中调用方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆