0

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
        }
    }
}
beginner992
  • 659
  • 1
  • 9
  • 28

0 Answers0