Swift tvOS-首选焦点环境不工作

Swift tvOS-首选焦点环境不工作,swift,uibutton,focus,tvos,Swift,Uibutton,Focus,Tvos,因为我需要在另一个UINavigationController中使用UINavigationController(默认情况下这是不可能的),所以我创建了一个充当UINavigationController的UIViewController,但dit并不是UINavigationController的子类 第二个NavigationController(对UINavigationController子类执行的导航控制器)显示(取决于ViewModel的状态)一个控制器 这是自定义Navigatio

因为我需要在另一个UINavigationController中使用UINavigationController(默认情况下这是不可能的),所以我创建了一个充当UINavigationController的UIViewController,但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上。但是如果用户愿意,他可以聚焦onoff按钮

不管我怎么做,都不管用。调用preferredFocusEnvironments,但按钮的焦点保持在错误的顺序


我做错了什么?

你是这样想的吗

 override var preferredFocusEnvironments: [UIFocusEnvironment] {
        return [finishButton]
 }

或者您可以禁用onOffButton的用户交互,直到finishButton获得焦点。(虽然不是一个好的解决方案)

您应该设置restoresFocusAfterTransition=false以避免默认行为。然后,在首选聚焦环境中返回要聚焦的视图

很抱歉回答得太晚。事实证明,我正在推的viewController定义为
let
,所以我推了几个实例,这就是为什么
首选焦点环境
似乎不起作用的原因。我实际上看到了ViewController的一个新实例,它具有另一个初始焦点顺序。将viewController的变量声明从
let
更改为
lazy var
,成功了。因此,最终,这与
首选聚焦环境
不起作用没有任何关系。但是谢谢你的投入