You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
10 KiB
240 lines
10 KiB
// |
|
// Navigator.swift |
|
// Lookfit |
|
// |
|
// Created by lemo. on 2020/3/7. |
|
// Copyright © 2020 Sheldon. All rights reserved. |
|
// |
|
|
|
import Foundation |
|
import UIKit |
|
import RxSwift |
|
import RxCocoa |
|
|
|
protocol Navigatable { |
|
var navigator: Navigator! { get set } |
|
} |
|
|
|
class Navigator { |
|
static var `default` = Navigator() |
|
|
|
// MARK: - segues list, all app scenes |
|
enum Scene { |
|
case tabs(viewModel: HomeTabBarViewModel) |
|
case guideUserInfo |
|
case binding(viewModel: BindingViewModel) |
|
case notice(viewModel: NoticeViewModel) |
|
case heartRateCheck(viewModel: HeartRateCheckViewModel) |
|
case notDisturb(viewModel: NotDisturbViewModel) |
|
case drinkRemind(viewModel: DrinkRemindViewModel) |
|
case repeatSet(viewModel: RepeatViewModel) |
|
case sedentary(viewModel: SedentaryViewModel) |
|
case alarmList(viewModel: NewAlarmListViewModel) |
|
case addAlarm(viewModel: NewAddAlarmViewModel) |
|
case about |
|
case target(viewModel: TargetVM) |
|
case unitSet |
|
case userInfo(viewModel: UserInfoViewModel) |
|
case step(viewModel: StepViewModel) |
|
case sleep(viewModel: SleepViewModel) |
|
case heartRate(viewModel: HRViewModel) |
|
case sportDetail(viewModel: SportDetailViewModel) |
|
case firmwareUpdate(viewModel: FirmwareUpdateViewModel) |
|
case dialPush(viewModel: DialPushViewModel) |
|
case temperatureCheck(viewModel: TemperarureCheckViewModel) |
|
case temperature(viewModel: TemperatureViewModel) |
|
case wechatSport(viewModel: WeChatSportViewModel) |
|
case bloodPressure(viewModel: BloodPressureViewModel) |
|
case bloodOxygen(viewModel: BloodOxygenViewModel) |
|
case telephonebook(ViewModel: TelephoneBookViewModel) |
|
case businesscard(ViewModel: businessCardViewModel) |
|
case theWallet(ViewModel: PaymentCodeViewModel) |
|
case upDataQRCodeImg(ViewModel:UpdataQRCodeImgViewModel) |
|
} |
|
|
|
enum Transition { |
|
case root(in: UIWindow) |
|
case navigation |
|
case modal |
|
} |
|
|
|
// MARK: - get a single VC |
|
func get(segue: Scene) -> UIViewController? { |
|
switch segue { |
|
case .tabs(let viewModel): |
|
let rootVC = HomeTabBarController(viewModel: viewModel, navigator: self) |
|
return rootVC |
|
case .guideUserInfo: |
|
let guideVC = GuideUserInfoViewController(viewModel: nil, navigator: self) |
|
guideVC.modalPresentationStyle = .fullScreen |
|
return guideVC |
|
case .binding(let viewModel): |
|
let bindingVC = BindingViewController(viewModel: viewModel, navigator: self) |
|
bindingVC.navigationTitle = MultiLanguageKey.binding.localized |
|
return bindingVC |
|
case .notice(let viewModel): |
|
let noticeVC = NoticeViewConrtoller(viewModel: viewModel, navigator: self) |
|
noticeVC.navigationTitle = MultiLanguageKey.notice.localized |
|
return noticeVC |
|
case .heartRateCheck(let viewModel): |
|
let heartRateCheckVC = HeartRateMonitorViewController(viewModel: viewModel, navigator: self) |
|
heartRateCheckVC.navigationTitle = MultiLanguageKey.heartCheck.localized |
|
return heartRateCheckVC |
|
case .notDisturb(let viewModel): |
|
let notDisturbVC = NotDisturbViewController(viewModel: viewModel, navigator: self) |
|
notDisturbVC.navigationTitle = MultiLanguageKey.notDisturb.localized |
|
return notDisturbVC |
|
case .drinkRemind(let viewModel): |
|
let drinkRemindVC = DrinkRemindViewController(viewModel: viewModel, navigator: self) |
|
drinkRemindVC.navigationTitle = MultiLanguageKey.drinkRemind.localized |
|
return drinkRemindVC |
|
case .repeatSet(let viewModel): |
|
let repeatTimeVC = RepeatTimeViewController(viewModel: viewModel, navigator: self) |
|
repeatTimeVC.navigationTitle = MultiLanguageKey.repeatCycle.localized |
|
return repeatTimeVC |
|
case .sedentary(let viewModel): |
|
let sedentaryVC = SedentaryViewController(viewModel: viewModel, navigator: self) |
|
sedentaryVC.navigationTitle = MultiLanguageKey.sedentary.localized |
|
return sedentaryVC |
|
case .alarmList(let viewModel): |
|
let newAlarmVC = NewAlarmViewController(viewModel: viewModel, navigator: self) |
|
newAlarmVC.navigationTitle = MultiLanguageKey.alarmClock.localized |
|
return newAlarmVC |
|
case .addAlarm(let viewModel): |
|
let newAddAlarmVC = NewAddAlarmVC(viewModel: viewModel, navigator: self) |
|
newAddAlarmVC.navigationTitle = viewModel.isAdd ? MultiLanguageKey.addAlarm.localized : MultiLanguageKey.editAlarm.localized |
|
return newAddAlarmVC |
|
case .about: |
|
let vc = AboutVC(viewModel: nil, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.about.localized |
|
return vc |
|
case .target(let viewModel): |
|
let vc = TargetVC(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.targetSet.localized |
|
return vc |
|
case .unitSet: |
|
let vc = UnitSetVC(viewModel: nil, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.unitSet.localized |
|
return vc |
|
case .userInfo(let viewModel): |
|
let vc = UserInfoViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.mineInfo.localized |
|
return vc |
|
case .step(let viewModel): |
|
let vc = StepViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.step.localized |
|
return vc |
|
case .sleep(let viewModel): |
|
let vc = SleepViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.sleep.localized |
|
return vc |
|
case .heartRate(let viewModel): |
|
let vc = HRViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.heartRate.localized |
|
return vc |
|
case .sportDetail(let viewModel): |
|
let vc = SportDetailViewController(viewModel: viewModel, navigator: self) |
|
return vc |
|
case .firmwareUpdate(let viewModel): |
|
let vc = FirmwareUpdateViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.firmwareUpgrade.localized |
|
return vc |
|
case .dialPush(let viewModel): |
|
let vc = DialPushViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.dialPush.localized |
|
return vc |
|
case .temperatureCheck(let viewModel): |
|
let vc = TemperarureCheckViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.temperatureCheck.localized |
|
return vc |
|
case .temperature(let viewModel): |
|
let vc = TemperatureViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.temperature.localized |
|
return vc |
|
case .wechatSport(let viewModel): |
|
let vc = WeChatSportViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.wechatSport.localized |
|
return vc |
|
case .bloodPressure(let viewModel): |
|
let vc = BloodPressureViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.bloodPressure.localized |
|
return vc |
|
case .bloodOxygen(let viewModel): |
|
let vc = BloodOxygenViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.bloodOxygen.localized |
|
return vc |
|
case .telephonebook(let viewModel): |
|
let vc = TelephoneBookViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.telephoneBook.localized |
|
return vc |
|
case .theWallet(let viewModel): |
|
let vc = PaymentCodeViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.theWallet.localized |
|
return vc |
|
case .businesscard(let viewModel): |
|
let vc = businessCardViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = MultiLanguageKey.businessCard.localized |
|
return vc |
|
case .upDataQRCodeImg(let viewModel): |
|
let vc = UpdataQRCodeImgViewController(viewModel: viewModel, navigator: self) |
|
vc.navigationTitle = viewModel.titleName |
|
return vc |
|
} |
|
} |
|
|
|
func pop(sender: UIViewController?, toRoot: Bool = false) { |
|
if toRoot { |
|
sender?.navigationController?.popToRootViewController(animated: true) |
|
} else { |
|
sender?.navigationController?.popViewController(animated: true) |
|
} |
|
} |
|
|
|
func dismiss(sender: UIViewController?) { |
|
sender?.navigationController?.dismiss(animated: true, completion: nil) |
|
} |
|
|
|
// MARK: - invoke a single segue |
|
func show(segue: Scene, sender: UIViewController?, transition: Transition = .navigation) { |
|
if let target = get(segue: segue) { |
|
show(target: target, sender: sender, transition: transition) |
|
} |
|
} |
|
|
|
private func show(target: UIViewController, sender: UIViewController?, transition: Transition) { |
|
switch transition { |
|
case .root(in: let window): |
|
window.rootViewController = target |
|
window.makeKeyAndVisible() |
|
return |
|
default: break |
|
} |
|
|
|
guard let sender = sender else { |
|
fatalError("You need to pass in a sender for .navigation or .modal transitions") |
|
} |
|
|
|
if let nav = sender as? UINavigationController { |
|
//push root controller on navigation stack |
|
nav.pushViewController(target, animated: false) |
|
return |
|
} |
|
|
|
switch transition { |
|
case .navigation: |
|
if let nav = sender.navigationController { |
|
// push controller to navigation stack |
|
nav.pushViewController(target, animated: true) |
|
} |
|
case .modal: |
|
// present modally |
|
DispatchQueue.main.async { |
|
let nav = NavigationController(rootViewController: target) |
|
nav.modalPresentationStyle = target.modalPresentationStyle |
|
sender.present(nav, animated: true, completion: nil) |
|
} |
|
default: break |
|
} |
|
} |
|
|
|
}
|
|
|