3

iOS の長いフォームに問題があります。フォーム自体は、静的なテーブル ビューで行われます。フォームには、前/次と完了のツールバーが必要でした。このプロジェクトではBSKeyboardControlsを追加しましたが、別のプロジェクトですでに自分で行っています。

次または前の textField/textView が見えない場合を除いて、ツールバーは正常に機能します。その後、以前の textField のフォーカスは変更されず、このテキスト フィールドにまだ入力しています。手動でスクロールして、対象の次のテキストフィールドが表示されると、魔法のようにファーストレスポンダになります。もちろん、これは期待される動作ではありません。

そのため、最初のレスポンダーとして設定する前に、テーブル ビューをそれぞれのフィールドにスクロールする必要があることがわかりました。しかし、私はこれを成し遂げることができません。

私はindexPathesでこれを試みました

NSIndexPath *path = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview];
[self.tableView scrollToRowAtIndexPat:path atScrollPosition:UITableViewScrollPositionTop animated:YES];

スーパースーパービューは有効な (そして正しい) テーブル セルですが、返されるパスは nil です。バリエーションも試してみました

CGPoint point = [self.tableView convertPoint:textField.frame.origin toView:self.tableView];
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point];

rects と indexPathsForRowsInRect を使用したその他のバリエーション。

唯一の方法は、textFields セルの indexPaths を手動で追跡することですが、この場合、それは適切な解決策ではありません。

tableView で見えない textField へのスクロールを実現する方法を知っている人はいますか?

編集:

ジャスティン・ポールソンがkeyboardControlsPreviousNextPressedのコードを要求したように:

- (void)keyboardControlsPreviousNextPressed:(BSKeyboardControls *)controls withDirection:(KeyboardControlsDirection)direction andActiveTextField:(id)textField
{
    NSIndexPath *path = [self.tableView indexPathForCell:(UITableViewCell *)((UIView *)textField).superview.superview];
    NSLog(@"path %@ for cell %@", path, ((UIView *)textField).superview.superview);
    [self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
    [textField becomeFirstResponder];
}

ログの出力によると、パスはゼロですが、スーパースーパービューは右側のテーブル ビュー セルです。

4

1 に答える 1

3

私を助けてくれてありがとう、私は自分で解決策を持っています。私の中でkeyboardControlsPreviousNextPressed私は今持っています

[self.tableView scrollRectToVisible:((UIView *)textField).superview.superview.frame animated:YES];
[textField becomeFirstResponder];

このソリューションは非常にうまく機能しているようです。私が遭遇した唯一の問題は、新しくフォーカスされた textField がキーボードによって隠されることがあるため、tableViewController が自動的に調整されないことです。ほとんどの場合、行を一番上までスクロールしてこれを回避できます。

NSIndexPath *path = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview];
[self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionTop animated:YES];
于 2012-06-21T08:18:43.370 に答える