tableView frame.origin проблема после того, как textField resignFirstResponder в пользовательском tableViewCell - PullRequest
2 голосов
/ 21 августа 2009

Я использую tableView с пользовательскими ячейками. Когда я хочу отобразить другое представление, используя функцию pushViewController навигационного контроллера, я перебираю текстовые поля и вызываю для них resignFirstResponder. Но resignFirstResponder работает только тогда, когда отображаются текстовые поля, поэтому я сначала прокручиваю до верхней части страницы. Это код:

NSIndexPath *topIndexPath;
topIndexPath = [[NSIndexPath indexPathWithIndex:0] indexPathByAddingIndex:0];
[self.tableView scrollToRowAtIndexPath:topIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

[[self textFieldForRow:0] resignFirstResponder];
[[self textFieldForRow:1] resignFirstResponder];
[[self textFieldForRow:2] resignFirstResponder];
[[self textFieldForRow:3] resignFirstResponder];

Это работает, но после этого у моего tableView есть странная проблема с его происхождением. Я пытался установить его происхождение суперпредставлений на 0, но это не помогает.

Вот скриншот проблемы: ссылка

Как видите, мое табличное представление слишком велико, и полоса прокрутки застревает в середине представления при достижении дна.

Извините за мой английский, я надеюсь, что вы меня понимаете,

Заранее спасибо!

Hans

Ответы [ 2 ]

2 голосов
/ 23 августа 2009

Это было на самом деле довольно просто. Просто поместите свой resignFirstResponder в -viewWillDisappear

edit: это лучше и менее хакерски, я добавил это в свой класс, и это сработало:

edit 2: кажется, что ваше приложение будет отклонено при использовании предыдущего кода. Вот обновленная публичная версия API:

- (void)viewWillDisappear:(BOOL)animated
{
    [self.view findAndResignFirstResponder];
}

И

@implementation UIView (FindAndResignFirstResponder)
- (BOOL)findAndResignFirstResponder
{
    if (self.isFirstResponder) {
        [self resignFirstResponder];
        return YES;     
    }
    for (UIView *subView in self.subviews) {
        if ([subView findAndResignFirstResponder])
            return YES;
    }
    return NO;
}
@end

(источник: Получение текущего первого респондента без использования частного API )

0 голосов
/ 21 августа 2009

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

Если так, то это потому, что ячеек экрана не существует, и поэтому текстовые поля также исчезли. Они перерабатываются (поэтому их можно снять с производства для новых ячеек).

Простое решение - вызывать resignFirstResponder только для тех текстовых полей, которые находятся на экране.

То, что ты сейчас делаешь, кажется немного глупым.

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