Подтвердить что ты не робот

Редактирование UITextField внутри UITableViewCell не выполняется

В моем приложении у меня есть UITextField внутри UITableViewCell. Если я щелкнул внутри текстового поля и добавил текст, я обнаружил, что если попытаться переместить точку вставки, он будет работать впервые, но при последующих попытках не будет выполнен. Я полностью не могу переместить выделение; не появляется "увеличительное стекло".

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

Если вы хотите увидеть это самостоятельно, попробуйте образец "UICatalog", который поставляется с iPhone SDK. Нажмите "текстовые поля", а затем "отредактируйте" и поиграйте с текстовыми полями.

Я много сделал для этого, но для Google это довольно сложно! Лучшие ссылки, которые я нашел, находятся на доска поддержки Apple и MacRumors formum (оба ссылаются на решение, которое, по-видимому, использовалось для работы на iPhone 2.0, но работает не с современными версиями - я действительно пытался).

Мое ощущение, что это ошибка в ОС, но я подумал, что выброшу это на толпу SO для второго мнения и посмотрю, есть ли какие-нибудь обходные пути. Любые идеи?

Следуя предложению бензадо, я попытался создать свое приложение, используя SDK 2.0, 2.1 и 2.2. У меня такое же поведение во всех версиях. (На самом деле, что-то связанное, но не то же самое произошло в 2.2, но это, вероятно, еще один вопрос!)

4b9b3361

Ответ 1

Я потратил много времени на это, но я, наконец, думаю, что я его прибил.

Фокус в том, что таблица должна быть доступна для редактирования (т.е. ее свойство editing должно быть установлено на YES). Хорошей новостью является то, что теперь вы можете перемещать точку ввода. Иногда увеличительное стекло не появляется или не появляется, но ваш жест всегда работает.

Сохраняется ли это как ошибка? Может быть. По крайней мере, документация Apple SDK должна быть обновлена. Я собрал отчет об ошибке с Apple, чтобы охватить это (rdar://6462725).

Ответ 2

Благодаря этому сообщению, я смог успешно заставить это работать должным образом в моем приложении.

Что-то добавить, однако:

Если вы настроите таблицу на редактирование, вы, вероятно, получите другое поведение, чем вы ожидаете (отступы, редактирование виджетов, индикаторы раскрытия и т.д.). Это меня удивило, но здесь, как лучше всего с этим справиться:

В вашем делете UITableView выполните:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

Затем в вашей реализации UITableViewCell установите UITableView для редактирования только ТОЛЬКО, когда вы на самом деле редактируете:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    ((UITableView *)[self superview]).editing = YES;
...
}

и отключить редактирование при редактировании:

- (void)textFieldDidEndEditing:(UITextField *)textField
{
...
    ((UITableView *)[self superview]).editing = YES;
}

Это гарантирует, что ваша таблица не находится в режиме редактирования, когда вы не редактируете ячейку, сохраняя работу гладко.

Спасибо!

Брайан М. Крискуоло Mark/Space Inc.

Ответ 3

Ответ Брайана М. Крискуоло является самым близким, однако его все еще не совсем верно - в моем использовании SDK2.2.1 я обнаружил, что мне нужно сделать следующее:

В ваш UITableViewDelegate (который часто является вашим UITableViewController) добавьте оба значения:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

и

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return UITableViewCellEditingStyleNone;
}

и

- (void)viewDidLoad {
[super viewDidLoad];

    // do any other customisation here
self.uiTableView.editing = true;
}

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

Вам не нужно ничего делать с делегатами текстового поля, как указал Брайан (если у вас нет нескольких строк, и вы хотите ответить на событие didSelectRowAtIndexPath: event, которое вы, похоже, не получаете в режиме редактирования, - тогда вы будете нужно также делать то, что он предлагает).

Кстати, это кажется исправленным в SDK3.0 (хотя, возможно, меняются изменения)

Ответ 4

Звучит как ошибка ОС. Я попытался бы воспроизвести его, запустив образец UICatalog против 2.0, 2.1 и 2.2 SDK, чтобы увидеть, что-то изменится. (Там ошибка, связанная с выравниванием текста таблицы, которая возникает, если вы создаете для версии 2.2, но не для сборки на 2.1, независимо от того, какая версия ОС находится на устройстве.)

Если это будет иметь значение, https://bugreport.apple.com/

Ответ 5

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

Ответ 6

на самом деле лучше всего работает, чтобы установить свойство "edit" таблицы в true в "viewDidLoad" и добавить их в делегат таблицы

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

вам не нужно ничего делать в делегате текстового поля