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.