web-dev-qa-db-ja.com

「textField:shouldChangeCharactersInRange:」を使用して、現在入力されている文字を含むテキストを取得するにはどうすればよいですか?

以下のコードを使用して、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」です

何が間違っていますか?

110
user265961

-shouldChangeCharactersInRangeが呼び出されますbeforeテキストフィールドが実際にテキストを変更するため、古いテキスト値が取得されます。更新後にテキストを取得するには、次を使用します。

[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
267
Vladimir
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSLog(@"%@",searchStr);
    return YES;
}
51
btmanikandan

スイフト3

受け入れられた答えに基づいて、以下は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
}

注意

StringNSStringの両方には、replacingCharacters:inRange:withStringと呼ばれるメソッドがあります。ただし、予想どおり、前者はRangeのインスタンスを期待し、後者はNSRangeのインスタンスを期待します。 textFieldデリゲートメソッドはNSRangeインスタンスを使用するため、この場合はNSStringを使用します。

36
focorner

UITextFieldDelegateを使用する代わりに、 "Editing Changed" UITextFieldのイベントを使用してください。

24
tomute

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
}
11
bauerMusic

そのための迅速なバージョン:

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
}
7
ioopl

これが必要なコードです、

if ([textField isEqual:self.textField1])
  textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
5

ガードを使用

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
    }
1
ober

私の解決策は、UITextFieldTextDidChangeNotificationを使用することです。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(copyText:) name:UITextFieldTextDidChangeNotification object:nil];

deallocメソッドで[[NSNotificationCenter defaultCenter] removeObserver:self];を呼び出すことを忘れないでください。

0
boweidmann

テキストフィールドのテキストをこれに置き換える必要がある場合は、私のソリューション(Swift 3)を使用できます。 https://Gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047

交換後、textField.text変換されたテキストを取得します。

0
blackjacx