Objective-C Runtime: Swizzled имя метода? - PullRequest
6 голосов
/ 20 октября 2011

В попытке Обнаружить возврат в UITextField , Я пытался создать подкласс UITextField и переопределить -[UIKeyInput deleteBackward], но он никогда не вызывается. Итак, я подозреваю, UITextField переходит deleteBackward на другое имя метода.

Используя Objective-C Runtime , как я могу определить, к какому методу deleteBackward было добавлено? Затем, как я могу изменить реализацию так, чтобы UITextField вызывал [self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""], когда клавиша удаления нажата, когда она пуста.

Кроме того, этот тип метапрограммирования отклонит мое приложение из App Store?

1 Ответ

4 голосов
/ 20 октября 2011

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

Мое предположение относительно того, почему метод deleteBackward не вызывается, заключается в том, что система ввода использует метод из более сложного протокола UITextInput , скорее всего, replaceRange:withText:. Попробуйте выполнить это и выполнить ваш вызов, когда аргумент text является пустой строкой. Также убедитесь, что функция Swizzling не возвращает ошибку.

...