UITableView scrollToRowAtIndexPath только иногда прокручивает - PullRequest
2 голосов
/ 26 апреля 2011

У меня есть UITableView с несколькими UITableViewCells, и внутри этих ячеек есть UITextFields.Я реализовал UIToolbar для переключения между различными текстовыми полями.Я могу перейти к следующему текстовому полю в следующей ячейке или к предыдущему текстовому полю.Это работает нормально до тех пор, пока ячейка не станет первым респондентом, который в данный момент не виден в табличном представлении.

Я выяснил, что

[self.tableview cellForRowAtIndexPath:indexPath]

возвращает nil и что прокрутка вручную до ячейки с помощьютекстовое поле, которое должно стать первым респондентом, устраняет проблему.Поэтому я попытался прокрутить к ячейке, прежде чем изменить ее, чтобы стать первым респондентом.

Я попытался сделать это с помощью

[[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

, но, к сожалению, просмотр таблицы не прокручивается до этой ячейки, но до всех других ячеек.Когда я добавляю точку останова к этой строке, проблема не возникает.Похоже, что просмотр таблицы прокручивается до ячейки, но затем снова прокручивается вниз.

Вот код cellForRowAtIndexPath:

UITableViewCell *cell;
static NSString *AttributeCellIdentifier = @"AttributeCellIdentifier";
    cell = [tableView dequeueReusableCellWithIdentifier:AttributeCellIdentifier];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"AttributeCell" owner:self options:nil];
        cell = attributeCell;
        self.attributeCell = nil;
        UITextField * textField = (UITextField *)[cell viewWithTag:1];
        [textField setKeyboardType:UIKeyboardTypeDecimalPad];
        [textField setInputAccessoryView:[self inputAccessoryView]];
    }
UITextField * textField;
textField = (UITextField *)[cell viewWithTag:1];
textField.placeholder = @"C(Probe)/mol/l";
return cell;

Вот код для переключения на предыдущее текстовое поле:

UIView * currentResponder = [self.view findFirstResonder];

UITextField * newFocusTextField;
UITableViewCell * cell = (UITableViewCell*)[[currentResponder superview] superview];
NSIndexPath* indexPath = [self.tableView indexPathForCell:cell];

newFocusTextField = (UITextField*)[[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]] viewWithTag:1];
[currentResponder resignFirstResponder];
[newFocusTextField becomeFirstResponder];

UITableViewCell * newCell = (UITableViewCell*)[[newFocusTextField superview] superview];
NSIndexPath * newIndexPath = [self.tableView indexPathForCell:newCell];
[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

Надеюсь, это поможет.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Код в вашем посте и определение проблемы не ясны на сто процентов, но в методах прокрутки, работающих на iOS 3.0, была ошибка / сбой (я думаю, конкретно 3.0, насколько я помню). Я не мог понять причину, по которой это произошло, но он все время падал, хотя для iOS 4.x это было нормально.

Исправлено добавление

[table reloadData] 

перед строкой прокрутки. Я знаю, что это не имеет смысла, и я знаю, что это не очень хорошая практика, особенно если рендеринг ячеек дорогой, но это действительно решило проблему в этом случае. Я не знаю, связана ли ваша проблема с той же проблемой, но вы можете просто попробовать ...

1 голос
/ 27 апреля 2011

Я попробовал несколько мыслей, и теперь все работает нормально.Я удалил:

[currentResponder resignFirstResponder];

И после удаления этой строки просмотр таблицы прекрасно прокрутился, и я могу напрямую установить указатель на новую ячейку с помощью newFocusTextField и сделать его firstResponder с помощью:

[newFocusTextField becomeFirstResponder];

У меня есть метод nextTextField, который отлично работает с

[currentResponder resignFirstResponder];

, поэтому я не совсем понимаю, почему возникает проблема, но я думаю, что лучше прокрутить ячейку, а затем просто установить новый firstResponder, а затем сначала отменить currentResponder..

Спасибо за помощь в любом случае;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...