How to call a function in a different class in swift

Viewed 57

I have a MainCoordinator class extending NSObject and having the following methods:

init(presenter: UINavigationController) {
    self.presenter = presenter
}

​func start() {
    let mainViewController = MainViewController(userDefaults: UserDefaults.standard)
    presenter.pushViewController(mainViewController, animated: false)
    self.mainViewController = mainViewController
     
    subscribeToEvents()
  }
   
  private func subscribeToEvents() {
    if let viewModel = mainViewController?.viewModel {
      viewModel.showOptions.subscribe(onNext: { [weak self] in
        self?.showOptions()
      }).disposed(by: disposeBag)
}
}
private func showOptions() {
     let actionSheet = UIAlertController(title: "Would you like to open the Camera or select one from your photo library?",
                                                message: nil,
                                                preferredStyle: .actionSheet)
        
        let cameraAction = UIAlertAction(title: "Use the Camera", style: .default) { [weak self] (_) in
            self?.openCameraScanner()
        }
        
        let photoLibraryAction = UIAlertAction(title: "Open Photo Library", style: .default) { [weak self] (_) in
            self?.openPhotoLibrary()
        }
        
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        
        actionSheet.addAction(cameraAction)
        actionSheet.addAction(photoLibraryAction)
        actionSheet.addAction(cancelAction)
        
        mainViewController?.present(actionSheet, animated: true, completion: nil)
}
}

MainViewController is a class extending UIViewController which has the following button:

lazy private var sButton: UIButton = {
    let button = UIButton(type: .custom)
    button.setTitle('options', for: .normal)
    button.backgroundColor = UIColor.yellow
    button.roundedCorners(radius: 25)
    button
      .rx
      .tap
      .bind(to: self.viewModel.showOptions)
      .disposed(by: self.disposableBag)
    return button
  }() 

This is its init method

init(userDefaults: UserDefaults) {
        viewModel = MainViewModel(userDefaults: userDefaults)
        super.init(nibName: nil, bundle: nil)
    }

The method self.viewModel.showOptions is of type PublishSubject, whenever I tap the sButton I want the showOptions method in MainCoordinator class to be activated.

import RxSwift

class MainViewModel {
    
    let disposeBag = DisposeBag()

    //Subjects
    let showScanOptions = PublishSubject<Void>()
..
 init(networkable: Networkable, userDefaults: UserDefaults) {
        self.networkable = networkable
        self.userDefaults = userDefaults
        
        loginResponse.value = userDefaults.loginResponse
        
        login.subscribe(onNext: { [weak self] in
            guard let username = self?.email.value, let password = self?.password.value else { return }
            self?.isLoading.onNext(true)
            
            let loginInputs = LoginInputs(email: username, password: password)
            self?.networkable.login(loginInputs: loginInputs) { loginResponse in
                guard let loginResponse = loginResponse else {
                    self?.errorSubject.onNext(nil)
                    self?.isLoading.onNext(true)
                    return
                }
                self?.userDefaults.loginResponse = loginResponse
                self?.loginResponse.value = loginResponse
            }
        }, onError: { [weak self] error in
            self?.isLoading.onNext(false)
            self?.errorSubject.onNext(error)
        }).disposed(by: disposeBag)
    }

}

How is this possible to achieve??

Any help is appreciated.

0 Answers
Related