Редактирование UITextField внутри UITableViewCell завершается неудачно - PullRequest
24 голосов
/ 18 декабря 2008

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

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

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

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

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

Следуя совету Бензадо, я попытался создать свое приложение с использованием SDK 2.0, 2.1 и 2.2. Я получил одинаковое поведение во всех версиях. (На самом деле, что-то связанное, но не то же самое сломалось в 2.2, но это, вероятно, другой вопрос!)

Ответы [ 7 ]

12 голосов
/ 22 декабря 2008

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

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

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

2 голосов
/ 02 июня 2009

Ответ Брайана М. Крискуоло - самый близкий, однако он все еще не совсем верен - при моем использовании 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: - которое вы, похоже, не получаете, находясь в режиме редактирования), тогда вы будете нужно также сделать как он предлагает).

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

2 голосов
/ 30 марта 2009

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

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

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

В вашем делегате 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.

0 голосов
/ 27 марта 2019

В iOS 12 или более поздней версии вы можете выбрать ячейку табличного представления в раскадровке, а затем включить Взаимодействие с пользователем включено в инспекторе атрибутов.

0 голосов
/ 20 марта 2010

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

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

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

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

0 голосов
/ 19 декабря 2008

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

0 голосов
/ 18 декабря 2008

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

Если что-то изменится, https://bugreport.apple.com/

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