When returning to parent view I want to transfer data using protocol but no response. The FavoriteViewController is a parent here, the AddViewController is a child. Using Back Button in AddViewController I want to pass a Bool value to the FavoriteViewController.
AddViewController:
protocol AddDelegate: class {
func stationAdded(_ added: Bool)
}
class AddViewController: UIViewController {
@IBOutlet weak var addTableView: UITableView!
private let disposeBag = DisposeBag()
var viewModel = AddViewModel()
weak var delegate: AddDelegate? = nil
var added: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
addTableView.rx.setDelegate(self).disposed(by: disposeBag)
bindTableView()
}
override func viewWillDisappear(_ animated: Bool) {
if self.isMovingFromParent {
print("xxx")
delegate?.stationAdded(true)
}
}
func bindTableView() {
viewModel.stationItems.bind(to: addTableView.rx.items(cellIdentifier: "addCell", cellType: AddTableViewCell.self)) { (row, item, cell)
in
cell.cellAdd = item
}.disposed(by: disposeBag)
addTableView.rx.modelSelected(StationItem.self)
.flatMap { [unowned self] item in
self.presentAlert(title: "Dodaj Stację", message: "Chcesz dodać stację do ulubionych?")
.map { item }
}
.bind { [viewModel] in
viewModel.addStationItem(stationItem: $0)
}
.disposed(by: disposeBag)
viewModel.fetchStations()
}
}
extension AddViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
}
extension AddViewController {
func presentAlert(title: String?, message: String?) -> Observable<Void> {
let result = PublishSubject<Void>()
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
let ok = UIAlertAction(title: "Dodaj", style: .default, handler: { _ in
result.onNext(())
result.onCompleted()
})
let cancel = UIAlertAction(title: "Anuluj", style: .cancel) { _ in
result.onCompleted()
}
alert.addAction(ok)
alert.addAction(cancel)
present(alert, animated: true)
return result
}
}
FavoriteViewController:
class FavoriteViewController: UIViewController, AddDelegate {
@IBOutlet weak var stationsTableView: UITableView!
private var disposeBag = DisposeBag()
private var viewModel = FavoriteViewModel()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.hidesBottomBarWhenPushed = true
stationsTableView.rx.setDelegate(self).disposed(by: disposeBag)
bindTableView()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.hidesBottomBarWhenPushed = false
stationsTableView.dataSource = nil
stationsTableView.delegate = nil
}
override func viewDidDisappear(_ animated: Bool) {
disposeBag = DisposeBag()
}
func stationAdded(_ added: Bool) {
print("added")
if added == true {
tabBarItem.title = "Added"
}
}
func bindTableView() {
self.viewModel.stationItems.asObservable().distinctUntilChanged().bind(to: stationsTableView.rx.items(cellIdentifier: "favoriteCell", cellType: FavoriteTableViewCell.self)) { (row,item,cell) in
cell.cellStation = item
}.disposed(by: disposeBag)
stationsTableView.rx.modelSelected(StationItem.self).subscribe(onNext: { item in
//print("SelectedItem: \(item.sensors)")
}).disposed(by: disposeBag)
deleteStation()
viewModel.fetchSavedStationItems()
}
func deleteStation() {
stationsTableView.rx.itemDeleted
.subscribe (onNext: { item in
self.viewModel.deleteStationItem(indexPath: item)
//Refresh itemsList in the ViewModel to remove right object
self.viewModel.fetchSavedStationItems()
})
.disposed(by: disposeBag)
}
@objc func addTapped() {
showAddViewController()
}
func showAddViewController() {
let addViewController = AddViewController()
addViewController.delegate = self
self.present(UINavigationController(rootViewController: addViewController), animated: true, completion: nil)
addViewController.modalPresentationStyle = .fullScreen
}
}
extension FavoriteViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0 {
return 120
} else {
return UITableView.automaticDimension
}
}
}