以下のコードを使用して、textField2
のテキストコンテンツはtextField1
は、ユーザーがtextField1
。
- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {
if (theTextField == textField1){
[textField2 setText:[textField1 text]];
}
}
しかし、私が観察した出力は...
textField1が「123」の場合、textField2は「12」です。
textField1が「1234」の場合、textField2は「123」です
...私が欲しいのは:
textField1が「123」の場合、textField2は「123」です。
textField1が「1234」の場合、textField2は「1234」です
何が間違っていますか?
-shouldChangeCharactersInRange
が呼び出されますbeforeテキストフィールドが実際にテキストを変更するため、古いテキスト値が取得されます。更新後にテキストを取得するには、次を使用します。
[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で動作するはずです。
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を使用する代わりに、 "Editing Changed" UITextFieldのイベントを使用してください。
Swift(4)で、NSString
なし(純粋なSwift):
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let textFieldString = textField.text, let swtRange = Range(range, in: textFieldString) {
let fullString = textFieldString.replacingCharacters(in: swtRange, with: string)
print("FullString: \(fullString)")
}
return true
}
そのための迅速なバージョン:
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];
dealloc
メソッドで[[NSNotificationCenter defaultCenter] removeObserver:self];
を呼び出すことを忘れないでください。
テキストフィールドのテキストをこれに置き換える必要がある場合は、私のソリューション(Swift 3)を使用できます。 https://Gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047
交換後、textField.text
変換されたテキストを取得します。