我有一个带有两个按钮的UIView。在MyView
课程中,我有以下代码:
-(BOOL) canBecomeFocused {
return YES;
}
-(NSArray<id<UIFocusEnvironment>> *)preferredFocusEnvironments {
return @[_editButton, _addButton];
}
-(IBAction) editTapped:(id) sender {
BOOL editing = !tableViewController.editing;
[_editButton setTitle:editing ? @"Done" : @"Edit" forState:UIControlStateNormal];
_addButton.hidden = !editing;
[tableViewController setEditing:editing animated:YES];
}
基本思想是用户可以将焦点移动到编辑按钮,然后可以显示“添加”按钮。
问题开始了,因为每次点击编辑按钮时,焦点都会转移到表格视图。我真的希望它移动到添加按钮。我也想要它,以便在编辑它停用时,编辑按钮保持焦点。但它再次转向表格视图。
所以我尝试了上面的代码。这适用于焦点可以移动到视图和按钮。但是一旦它存在,我无法让它移动到其他任何地方。
我读过的所有内容都只是覆盖preferredFocusEnvironments
,但到目前为止,我还没有能够让它发挥作用。焦点继续按下按钮然后拒绝移动到其他地方。
有什么想法吗?
答案 0 :(得分:2)
如果有人遇到此问题,只需检查控制台中是否打印了以下调试消息。
警告:正在进行焦点更新时,调用updateFocusIfNeeded。此呼叫将被忽略。
我有以下代码:
// MARK: - Focus Environment
var viewToBeFocused: UIView?
func updateFocus() {
setNeedsFocusUpdate()
updateFocusIfNeeded()
}
override var preferredFocusEnvironments: [UIFocusEnvironment] {
if let viewToBeFocused = self.viewToBeFocused {
self.viewToBeFocused = nil
return [viewToBeFocused]
}
return super.preferredFocusEnvironments
}
我多次调用updateFocus()
方法,而viewToBeFocused
为nil或其他视图。主要在过渡之间调试焦点问题确实很困难。你应该有耐心。
重要说明:这取决于您的用例,但是如果您想 在向视图控制器过渡后立即更新焦点(向后 导航),您可能必须在viewDidLoad中设置以下内容:
restoresFocusAfterTransition = false // default is true
如果这是真的,那么即使我们通过调用updateFocusIfNeeded()
来强制进行焦点更新,视图控制器也倾向于将最后一个焦点视图聚焦。在这种情况下,由于焦点更新已经在进行中,您将在此答案的顶部收到如前所述的警告。
使用以下链接调试焦点问题:https://developer.apple.com/documentation/uikit/focus_interactions/debugging_focus_issues_in_your_app
首先在“编辑方案”>“启动时传递的参数”下启用焦点调试器:
-UIFocusLoggingEnabled YES
这将记录焦点引擎进行的所有更新焦点的尝试。这真的很有帮助。
答案 1 :(得分:1)
您可以使用以下逻辑覆盖preferredFocusEnviromnets:
-(NSArray<id<UIFocusEnvironment>> *)preferredFocusEnvironments {
if (condition) {
return @[_editButton];
}
else {
return @[_addButton];
}
}
设置完成后,您可以调用
[_myView setNeedsFocusUpdate];
[_myView updateFocusIfNeeded];
条件可以是BOOL condition = tableViewController.editing;
或sg。
如果现在有效,你可以延迟调用(0.1秒左右)。