Использование `textField: shouldChangeCharactersInRange:`, как мне получить текст, включая текущий типизированный символ?
Я использую код ниже, чтобы попытаться обновить текстовый контент textField2
, чтобы он соответствовал textField1
всякий раз, когда пользователь вводит в textField1
.
- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {
if (theTextField == textField1){
[textField2 setText:[textField1 text]];
}
}
Однако вывод, который я наблюдаю, заключается в том, что...
textField2 равен "12", когда textField1 равен "123"
textField2 - "123", когда textField1 равен "1234"
... когда я хочу:
textField2 - "123", когда textField1 равен "123"
textField2 - "1234" , когда textField1 равен "1234"
Что я делаю неправильно?
-shouldChangeCharactersInRange
получает название до, текстовое поле фактически меняет текст, поэтому вы получаете старое текстовое значение. Чтобы получить текст после обновления, используйте:
[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSLog(@"%@",searchStr);
return YES;
}
Swift 3
В соответствии с принятым ответом следующее должно работать в Swift 3:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
return true
}
Примечание
Оба String
и NSString
имеют методы, называемые replacingCharacters:inRange:withString
. Однако, как и ожидалось, первый ожидает экземпляр Range
, в то время как последний ожидает экземпляр NSRange
. Метод делегата textField
использует экземпляр NSRange
, поэтому использование NSString
в этом случае.
Вместо использования UITextFieldDelegate попытайтесь использовать "Редактирование измененного" события UITextField.
Быстрая версия для него:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if string == " " {
return false
}
let userEnteredString = textField.text
var newString = (userEnteredString! as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString
print(newString)
return true
}
Это код, который вам нужен,
if ([textField isEqual:self.textField1])
textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
использовать охрану
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard case let textFieldString as NSString = textField.text where
textFieldString.stringByReplacingCharactersInRange(range, withString: string).length <= maxLength else {
return false
}
return true
}
Мое решение - использовать UITextFieldTextDidChangeNotification
.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(copyText:) name:UITextFieldTextDidChangeNotification object:nil];
Не забудьте вызвать [[NSNotificationCenter defaultCenter] removeObserver:self];
в методе dealloc
.
Если вам нужно заменить текст текстового поля на это, вы можете использовать мое решение (Swift 3): https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047
После замены вы можете просто получить textField.text
для извлечения скомпонованного текста.
Посмотрите другие вопросы по меткам ios objective-c uitextfield или Задайте вопрос