各セルに UITextField を持つ UITableViewController があります。ユーザーがフィールドで Return キーを押すと、次のフィールドが自動的にファーストレスポンダーに設定され、テーブルがスクロールしてそのフィールドが表示されます。
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
UITextField *nextTextField=nil;
NSInteger row;
NSInteger section;
if(textField == self.txtFieldA)
{
nextTextField = self.txtFieldB;
row=1; section=0;
}
else if(textField == self.txtFieldB)
{
nextTextField = self.txtFieldC;
row=2; section=0;
}
else
{
[textField resignFirstResponder];
}
if(nextTextField)
{
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
[nextTextField becomeFirstResponder];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
}
この問題は、テキスト フィールド (txtFieldA など) を選択し、テーブルを下にスクロールして txtFieldB が表示されないようにしてから、Enter キーを押すと発生します。iOS5 では期待どおりに動作します (txtFieldB が新しいファーストレスポンダーになります)。ただし、iOS6ではそうではありません。テーブル内の正しい場所にスクロールしますが、txtFieldB は最初のレスポンダーになりません (そして、ナビゲーション コントローラーで [戻る] を押しても、キーボードが表示されたままになります)。
「戻る」を押すと、txtFieldB の didBeginEditing が起動されません。1秒ほど遅らせると[nextTextField becomeFirstResponder]
(スクロールアニメーションが終了してnextTextFieldが表示されるまで)、期待どおりに機能しますが、それを行うのはハックでスムーズではないため、そのようなものを実装するよりも何が問題なのかを理解したいと思います。