Измените текст 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 ваши комментарии).

  • Динамический поиск в виде таблицы в iOS
  • Запретить автоматически открывать клавиатуру с помощью UIAlertController
  • Как центрировать текст UITextField в Swift
  • Ограничение копирования вставки строки в числовом текстовом поле
  • Авария UITextFieldDelegate (exc_bad_access)
  • UITextField - (void) drawPlaceholderInRect: (CGRect) rect возвращает другую высоту CGRect в iOS 7
  • iPhone: как перечислить через UITextFields
  • Отключите клавиатуру, если появится всплывающее окно действий
  • Как отключить язык смены в числовой панели в iOS Objective C?
  • Логика для перемещения текстового поля над клавиатурой
  • Действие кнопки «Go» на клавиатуре ios
  • Interesting Posts

    Центральный сервер и периферийный клиент CoreBluetooth

    Кодирование AAC с использованием AudioConverter и запись в AVAssetWriter

    Google plus API для публикации на стене, например, Facebook

    Использование AVAssetWriter для создания MPEG-2 TS

    Как правильно переопределить reloadRowsAtIndexPaths: withRowAnimation?

    Настройка кнопок управления левой и правой кнопками UISegmentedControl

    Анимация пользовательского свойства подкласса CAShapeLayer на основе свойства path

    (kCFStreamErrorDomainSSL, -9814)

    Есть ли способ сравнить изображения кнопок в Swift / iOS

    используя 'vendored_frameworks' и 'source_files' для cocoapod, используя 'use_frameworks!'

    Панорамный и косвенный распознаватель жестов для одного и того же вида, который должен быть неудачным для другого?

    Таймер iOS работает в фоновом режиме

    Усовершенствования в приложении для начинающих iOS

    Попытка конвертировать временную метку Firebase в NSDate в Swift

    достижимостьWithAddress не работает в программировании Objective C

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.