tvOS preferredfocusedview 并不总是被调用
tvOS preferredfocusedview is not always called
在模态呈现 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];
在 tvOS 9 中实现自定义焦点行为是一场灾难。 Apple 已经提到,在 WWDC 中呈现/关闭 viewcontroller 时,特别是在重定向焦点方面存在限制。
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 有点新,还为时过早。很抱歉不能给你很好的解释为什么这可能有效。祝你好运。
如果您使用的是容器视图,有多个 ViewController 或仅添加一个视图控制器,则必须从根视图控制器调用 preferredFocusEnvironments 方法,指示要关注哪个视图控制器。
例如。
视图控制器 A 有一个容器视图,容器内有 ViewControllers B 和 ViewController C。
视图控制器 A 应该有 preferredFocusEnvironments 返回 ViewController 聚焦。
这样,只要视图可见,就会调用 ViewController B 或 ViewController C 上的 preferredFocusEnvironments。
如果 ViewController A 没有 preferredFocusEnvironments,则不会在 containerView ViewControllers 上调用它。
在模态呈现 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];
在 tvOS 9 中实现自定义焦点行为是一场灾难。 Apple 已经提到,在 WWDC 中呈现/关闭 viewcontroller 时,特别是在重定向焦点方面存在限制。
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 有点新,还为时过早。很抱歉不能给你很好的解释为什么这可能有效。祝你好运。
如果您使用的是容器视图,有多个 ViewController 或仅添加一个视图控制器,则必须从根视图控制器调用 preferredFocusEnvironments 方法,指示要关注哪个视图控制器。
例如。
视图控制器 A 有一个容器视图,容器内有 ViewControllers B 和 ViewController C。
视图控制器 A 应该有 preferredFocusEnvironments 返回 ViewController 聚焦。
这样,只要视图可见,就会调用 ViewController B 或 ViewController C 上的 preferredFocusEnvironments。
如果 ViewController A 没有 preferredFocusEnvironments,则不会在 containerView ViewControllers 上调用它。