在行选择上保留 tableView
Leave tableView on row selection
我正在尝试在 ViewController 中创建一个 TableView 作为选择器。
这是一个简单的 Table 带有文本标签的视图。
我的问题是,我不能离开 tableview 继续下一个文本字段。
我已经用这段代码试过了:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[_textfield becomeFirstResponder];
}
但这只会打开键盘,在我进行输入后我又回到了表格视图中。
当我连续 select 行时,我必须怎么做才能离开 tableview?
故事板中的图片。
Objective-C
您需要跟踪并更新您 UITableViewCell
的 preferredFocusView
子类,具体取决于单元格是否已被选中以及 UIFocusHeading
是什么。
您应该做的第一件事是在您的 UITableViewCell
子类上添加一个 属性 以跟踪您希望聚焦的当前子视图。例如:
@property (nonatomic, strong) UIView *currentPreferredFocusedSubview;
然后在 didSelectRowAtIndexPath
的视图控制器中,您应该将其设置为您想要聚焦的文本字段,然后请求聚焦引擎更新:
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
TableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:YES];
cell.currentPreferredFocusedSubview = cell.textField;
[cell setNeedsFocusUpdate];
}
现在,在您的 UITableViewCell
子类中,您需要 return 您首选的焦点视图,并通过覆盖 preferredFocusedView
和 shouldUpdateFocusInContext
来更改焦点引擎的更新方式:
- (UIView *)preferredFocusedView
{
return self.currentPreferredFocusedSubview;
}
- (BOOL)shouldUpdateFocusInContext:(UIFocusUpdateContext *)context
{
if (self.currentPreferredFocusedSubview == self.textField && context.focusHeading == UIFocusHeadingRight)
{
self.currentPreferredFocusedSubview = self.textField2;
}
else if (self.currentPreferredFocusedSubview == self.textField2 && context.focusHeading == UIFocusHeadingRight)
{
self.currentPreferredFocusedSubview = self.textField3;
}
else if (self.currentPreferredFocusedSubview == self.textField3 && context.focusHeading == UIFocusHeadingRight)
{
self.currentPreferredFocusedSubview = self.textField3;
}
else if (self.currentPreferredFocusedSubview == self.textField3 && context.focusHeading == UIFocusHeadingLeft)
{
self.currentPreferredFocusedSubview = self.textField2;
}
else if (self.currentPreferredFocusedSubview == self.textField2 && context.focusHeading == UIFocusHeadingLeft)
{
self.currentPreferredFocusedSubview = self.textField;
}
else if (self.currentPreferredFocusedSubview == self.textField && context.focusHeading == UIFocusHeadingLeft)
{
self.currentPreferredFocusedSubview = self.textField;
}
else
{
self.currentPreferredFocusedSubview = nil;
}
return true;
}
这里我们只是根据焦点引擎的前进方向更新 preferredFocusedView
。如果向上或向下,下一行将成为焦点,因为我们 returning nil
。如果是左或右,相应的文本字段。这有点笨拙,但这是 tvOS 9 以编程方式更新焦点视图的方式。
Swift
var currentPreferredFocusedSubview: UITextField?
override var preferredFocusedView: UIView? {
get{
return self.currentPreferredFocusedSubview
}
}
override func shouldUpdateFocusInContext(context: UIFocusUpdateContext) -> Bool {
switch (self.currentPreferredFocusedSubview, context.focusHeading) {
case (self.textField?, UIFocusHeading.Right):
self.currentPreferredFocusedSubview = self.textField2
case (self.textField2?, UIFocusHeading.Right):
self.currentPreferredFocusedSubview = self.textField3
case (self.textField3?, UIFocusHeading.Right):
self.currentPreferredFocusedSubview = self.textField3
case (self.textField3?, UIFocusHeading.Left):
self.currentPreferredFocusedSubview = self.textField2
case (self.textField2?, UIFocusHeading.Left):
self.currentPreferredFocusedSubview = self.textField
case (self.textField?, UIFocusHeading.Left):
self.currentPreferredFocusedSubview = self.textField
default:
self.currentPreferredFocusedSubview = nil
}
return true
}
我正在尝试在 ViewController 中创建一个 TableView 作为选择器。
这是一个简单的 Table 带有文本标签的视图。
我的问题是,我不能离开 tableview 继续下一个文本字段。
我已经用这段代码试过了:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[_textfield becomeFirstResponder];
}
但这只会打开键盘,在我进行输入后我又回到了表格视图中。
当我连续 select 行时,我必须怎么做才能离开 tableview?
故事板中的图片。
Objective-C
您需要跟踪并更新您 UITableViewCell
的 preferredFocusView
子类,具体取决于单元格是否已被选中以及 UIFocusHeading
是什么。
您应该做的第一件事是在您的 UITableViewCell
子类上添加一个 属性 以跟踪您希望聚焦的当前子视图。例如:
@property (nonatomic, strong) UIView *currentPreferredFocusedSubview;
然后在 didSelectRowAtIndexPath
的视图控制器中,您应该将其设置为您想要聚焦的文本字段,然后请求聚焦引擎更新:
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
TableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:YES];
cell.currentPreferredFocusedSubview = cell.textField;
[cell setNeedsFocusUpdate];
}
现在,在您的 UITableViewCell
子类中,您需要 return 您首选的焦点视图,并通过覆盖 preferredFocusedView
和 shouldUpdateFocusInContext
来更改焦点引擎的更新方式:
- (UIView *)preferredFocusedView
{
return self.currentPreferredFocusedSubview;
}
- (BOOL)shouldUpdateFocusInContext:(UIFocusUpdateContext *)context
{
if (self.currentPreferredFocusedSubview == self.textField && context.focusHeading == UIFocusHeadingRight)
{
self.currentPreferredFocusedSubview = self.textField2;
}
else if (self.currentPreferredFocusedSubview == self.textField2 && context.focusHeading == UIFocusHeadingRight)
{
self.currentPreferredFocusedSubview = self.textField3;
}
else if (self.currentPreferredFocusedSubview == self.textField3 && context.focusHeading == UIFocusHeadingRight)
{
self.currentPreferredFocusedSubview = self.textField3;
}
else if (self.currentPreferredFocusedSubview == self.textField3 && context.focusHeading == UIFocusHeadingLeft)
{
self.currentPreferredFocusedSubview = self.textField2;
}
else if (self.currentPreferredFocusedSubview == self.textField2 && context.focusHeading == UIFocusHeadingLeft)
{
self.currentPreferredFocusedSubview = self.textField;
}
else if (self.currentPreferredFocusedSubview == self.textField && context.focusHeading == UIFocusHeadingLeft)
{
self.currentPreferredFocusedSubview = self.textField;
}
else
{
self.currentPreferredFocusedSubview = nil;
}
return true;
}
这里我们只是根据焦点引擎的前进方向更新 preferredFocusedView
。如果向上或向下,下一行将成为焦点,因为我们 returning nil
。如果是左或右,相应的文本字段。这有点笨拙,但这是 tvOS 9 以编程方式更新焦点视图的方式。
Swift
var currentPreferredFocusedSubview: UITextField?
override var preferredFocusedView: UIView? {
get{
return self.currentPreferredFocusedSubview
}
}
override func shouldUpdateFocusInContext(context: UIFocusUpdateContext) -> Bool {
switch (self.currentPreferredFocusedSubview, context.focusHeading) {
case (self.textField?, UIFocusHeading.Right):
self.currentPreferredFocusedSubview = self.textField2
case (self.textField2?, UIFocusHeading.Right):
self.currentPreferredFocusedSubview = self.textField3
case (self.textField3?, UIFocusHeading.Right):
self.currentPreferredFocusedSubview = self.textField3
case (self.textField3?, UIFocusHeading.Left):
self.currentPreferredFocusedSubview = self.textField2
case (self.textField2?, UIFocusHeading.Left):
self.currentPreferredFocusedSubview = self.textField
case (self.textField?, UIFocusHeading.Left):
self.currentPreferredFocusedSubview = self.textField
default:
self.currentPreferredFocusedSubview = nil
}
return true
}