在以模态方式呈现viewcontroller之后,将调用初始preferredfocusedview。然而,在我们解除了viewcontroller并且它已被dealloc之后。再次呈现viewcontroller后不调用preferredfocusedview。在tvOS 9.2上运行。
即使添加以下内容也无济于事:
-(void) viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self setNeedsFocusUpdate];
[self updateFocusIfNeeded];
}
任何人都知道发生了什么事吗?或者,如果有任何调试这个?
编辑: 我添加viewcontroller的方式:
viewController = [[UIViewController alloc] init];
[viewController addChildViewController:self];
[viewController.view addSubview:self.view];
[self didMoveToParentViewController:viewController];
答案 0 :(得分:1)
在tvOS 9中实现自定义焦点行为是灾难。 Apple已经提到,在WWDC中呈现/解除视图控制器时,重定向焦点存在限制。
tvOS10将使用preferredFocusEnvironments更好地处理munch。 https://developer.apple.com/videos/play/wwdc2016/215/
当我需要在tvOS 9中的viewDidAppear中修复此焦点重定向问题时,我遇到了完全相同的问题。有时它有效,有时不行。不知道是怎么回事。但是,在我对viewDidAppear中的setNeedsFocusUpdate / updateFocusIfNeeded进行拆分秒延迟之后,它在一致性方面更好。 preferredFocusedView一直被调用。
-(void) viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self setNeedsFocusUpdate];
[self updateFocusIfNeeded];
});
}
如果您手动更改焦点,请在呈现和呈现视图控制器中执行此操作。这完全取决于我的观察结果,我认为没有一种正确的方法可以实现一些焦点行为,因为tvOS API是一种新的和不成熟的方式。很抱歉无法解释为什么这可行。祝你好运。
答案 1 :(得分:1)
如果您使用的是容器视图,具有多个ViewController或仅添加一个View Controller,则必须从rootView Controller调用preferredFocusEnvironments方法,以指示要聚焦的View Controller。
例如
View Controller A有一个容器View,在容器内有ViewControllers B和ViewController C。
View Controller A应该具有PreferredFocusEnvironments返回要聚焦的ViewController。
这样,只要视图变为可见,就会调用ViewController B或ViewController C上的preferredFocusEnvironments。
如果ViewController A不具有preferredFocusEnvironments,则不会在containerView ViewControllers上调用它。