Измените текст UITextField прямо перед редактированием при использовании пользовательского UITableViewCell

У меня здесь странная проблема. У меня есть UITableView с использованием пользовательских UITableViewCells. Все работает как ожидалось, кроме этого по конкретной проблеме.

Вот сценарий:

Мне нужно удалить символ «$» в UITextField прямо перед началом редактирования. Это делается с помощью метода textFieldShouldBeginEditing:

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { LifeEarningsLineItemTableViewCell *cell = (LifeEarningsLineItemTableViewCell *)[self tableViewCellContainingObject:textField inTableView:self.lifeEarningsTableView]; if (textField == cell.itemAmount) { /*Remove currency symbol for editing.*/ NSString *currencySymbol = [self.currencyFormatter currencySymbol]; NSMutableString *mutableText = [NSMutableString stringWithString:textField.text]; [mutableText replaceOccurrencesOfString:currencySymbol withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableText length])]; textField.text = mutableText; } return YES; } 

Вот проблема:

  • Между разными строками, переходя от textField1 к textField2 (в другой строке), «$» удаляется, это ХОРОШО .
  • В пределах той же строки, перемещаясь из textField1 в textField2, «$» не удаляется, это BAD .

Почему «$» не удаляется в одной строке, но выполняется в разных строках?

Вот визуальное представление проблемы: вопрос

[EDIT … Сложение]
Я получаю эти журналы с этими потоками:

FLOW1
СЛЕДУЕТ НАЧАТЬ ….. Строка: 0, Метка: 0
СЛЕДУЕТ НАЧАТЬ ….. Строка: 0, Метка: 1
DID END ….. Строка: 0, Метка: 0
DID END ….. Строка: 0, Тег: 1

Flow2
СЛЕДУЕТ НАЧАТЬ ….. Строка: 0, Метка: 0
СЛЕДУЕТ НАЧАТЬ ….. Строка: 1, Метка: 1
DID END ….. Строка: 0, Метка: 0
DID END ….. Строка: 1, Тег: 1

Кроме того, здесь приведен метод tableViewCellContainingObject:inTableView:tableView :

 - (UITableViewCell *)tableViewCellContainingObject:(UIView *)view inTableView:(UITableView *)tableView { CGPoint objectRectInTableViewCoordinates = [tableView convertPoint:view.bounds.origin fromView:view]; NSIndexPath *cellIndexPath = [tableView indexPathForRowAtPoint:objectRectInTableViewCoordinates]; return [tableView cellForRowAtIndexPath:cellIndexPath]; } 

И метод textFieldDidEndEditing :

 - (void)textFieldDidEndEditing:(UITextField *)textField { LifeEarningsLineItemTableViewCell *cell = (LifeEarningsLineItemTableViewCell *)[self tableViewCellContainingObject:textField inTableView:self.lifeEarningsTableView]; LifeEarningsLineItem *lifeEarningsLineItem = [self.lifeEarningsFetchedResultsController objectAtIndexPath:[self.lifeEarningsTableView indexPathForCell:cell]]; if (textField == cell.itemAmount) { NSNumber *absInteger = [NSNumber numberWithInteger:abs([textField.text integerValue])]; textField.text = [self.currencyFormatter stringFromNumber:absInteger]; lifeEarningsLineItem.amount = absInteger; [self sumAmountsAndDisplay]; } else if (textField == cell.itemName) { lifeEarningsLineItem.name = textField.text; } } 

2 Solutions collect form web for “Измените текст UITextField прямо перед редактированием при использовании пользовательского UITableViewCell”

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

  • Не храните символ валюты в своей модели, добавьте его в отображаемый текст в cellForRowAtIndexPath, если текстовое поле не редактируется. Когда ваше текстовое поле начинает редактирование, установите его текст в значение непосредственно из модели. Вам не нужно ничего делать в конце редактирования, так как перезагрузка добавит к вам символ валюты.
  • Если вы не хотите менять модель, вы можете сделать что-то подобное в любом случае – в cellForRowAtIndexPath удалите символ валюты, если ячейка редактирует.
  • Сохраните путь указателя к текущей редактируемой строке и условно проигнорируйте изменения этой строки в методе делегата FRC.

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

Итак, вот как я решил проблему (но я все еще опасаюсь, что все это может рухнуть):

Из-за порядка событий …

 SHOULD BEGIN.....Row:0, Tag:0 SHOULD BEGIN.....Row:0, Tag:1 DID END.....Row:0, Tag:0 DID END.....Row:0, Tag:1 

… Я не мог просто использовать свойство BOOL чтобы сказать, что текстовое поле находится в режиме редактирования (порядок событий должен быть BEGIN-> END-> BEGIN-> END).

Поэтому я создал свойство:
@property (nonatomic, strong) NSMutableSet *stackOfEditingTextFields;

Затем в начале метода textFieldShouldBeginEditing: я добавил:

 /*Add text field to stack of editing text fields and disable the fetched results controller delegate.*/ [self.stackOfEditingTextFields addObject:textField]; self.lifeEarningsFetchedResultsController.delegate = nil; 

Затем в конце метода textFieldDidEndEditing: я добавил:

 /*Remove text field from stack of editing text fields. If stack count is 0, reengage the fetched results controller delegate.*/ [self.stackOfEditingTextFields removeObject:textField]; if ([self.stackOfEditingTextFields count] == 0) self.lifeEarningsFetchedResultsController.delegate = self; 

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

Спасибо за помощь lnafziger , помогая мне работать через нее и предлагая разные ракурсы (I + 1'd ваши комментарии).

  • UITextVIew secureTextEntry не работает
  • shouldChangeCharactersInRange не вызывается для предложений клавиатуры
  • Если программный код UITextField установлен как программный, то вызывайте некоторые странные действия при редактировании текста
  • Как рисовать Rounded Rectangles вокруг текстовых полей и кнопок, таких как приложение Foursquare
  • Включить копирование и вставку на UITextField, не делая его редактируемым
  • Установить диапазон числовых значений для текстового поля
  • UITextField inputView не отображается в iPhone 6
  • Переключение UITextField для отображения и скрытия в Swift
  • Настроить поле UIText в UISearchbar - iOS
  • Числовая компоновка не липкая в безопасном UITextField?
  • Как использовать UITextfield для обработки двунаправленных языков (например, арабских)
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.