【发布时间】:2017-10-10 14:04:28
【问题描述】:
因为我在另一个 UINavigationController 中需要一个 UINavigationController(默认情况下这是不可能的),所以我创建了一个 UIViewController 充当 UINavigationController,但 dit 不是 UINavigationController 的子类。
第二个 NavigationController(继承 UINavigationController 的那个)呈现(取决于 ViewModel 的状态)一个控制器。
这是自定义 NavigationController:
class OnboardingViewController: UIViewController {
// MARK: - Outlets
@IBOutlet weak var containerView: UIView!
// MARK: - Internal
private var viewModel: OnboardingViewModel = OnboardingViewModel()
// MARK: - View flow
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.isHidden = true
navigateToNextFlow()
}
override var preferredFocusEnvironments: [UIFocusEnvironment] {
switch viewModel.state {
case .recommendations: return recommendationsController.preferredFocusEnvironments
default: return super.preferredFocusEnvironments
}
}
// MARK: - Handlers
var navigateToNextHandler: (() -> Void)?
// MARK: - Controllers
private var recommendationsController: OnboardingRecommendationsViewController {
let controller = UIViewController.instantiate(from: "Onboarding Recommendations") as OnboardingRecommendationsViewController
controller.navigateToNextHandler = { [unowned self] in
self.viewModel.state = .done
self.navigateToNextFlow(animated: true)
}
return controller
}
// MARK: - Navigation
private func navigateToNextFlow(animated: Bool = false) {
switch viewModel.state {
case .recommendations:
add(child: recommendationsController, to: containerView)
case .done:
viewModel.finish()
navigateToNextHandler?()
}
updateFocusIfNeeded()
setNeedsFocusUpdate()
}
}
这是 childViewController:
class OnboardingRecommendationsViewController: UIViewController {
// MARK: - Outlets
@IBOutlet weak var onOffButton: UIButton!
@IBOutlet weak var finishButton: UIButton!
// MARK: - Internal
fileprivate let viewModel: OnboardingRecommendationsViewModel = OnboardingRecommendationsViewModel()
// MARK: - View flow
override func viewDidLoad() {
super.viewDidLoad()
setupLabels()
setupOnOffButton()
}
// MARK: - Handlers
var navigateToNextHandler: (() -> Void)?
// MARK: - Focus
override var preferredFocusEnvironments: [UIFocusEnvironment] {
return [finishButton, onOffButton]
}
}
finishButton 位于情节提要中的 onOffButton 下方。我正在尝试将初始焦点设置在 finishButton 而不是 onOffButton 上。但用户可以根据需要关注 onOffButton。
无论我尝试什么,它都不起作用。调用了 preferredFocusEnvironments,但按钮的焦点保持错误的顺序。
我做错了什么?
【问题讨论】: