在行选择上保留 tableView

Leave tableView on row selection

我正在尝试在 ViewController 中创建一个 TableView 作为选择器。

这是一个简单的 Table 带有文本标签的视图。

我的问题是,我不能离开 tableview 继续下一个文本字段。

我已经用这段代码试过了:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{


    [_textfield becomeFirstResponder];

}

但这只会打开键盘,在我进行输入后我又回到了表格视图中。

当我连续 select 行时,我必须怎么做才能离开 tableview?

故事板中的图片。

Objective-C

您需要跟踪并更新您 UITableViewCellpreferredFocusView 子类,具体取决于单元格是否已被选中以及 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 您首选的焦点视图,并通过覆盖 preferredFocusedViewshouldUpdateFocusInContext 来更改焦点引擎的更新方式:

- (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
}