[ios] `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”입니다.

내가 뭘 잘못하고 있죠?



답변

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


답변

스위프트 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
}

노트

둘 다 StringNSString라는 방법을 replacingCharacters:inRange:withString. 그러나 예상대로 전자는의 인스턴스를 Range예상하고 후자는의 인스턴스를 예상합니다 NSRange. textField위임 방법은 사용 NSRange인스턴스의 사용, 따라서 NSString이 경우에는.


답변

UITextFieldDelegate를 사용하는 대신 UITextField의 “Editing Changed” 이벤트를 사용해보십시오 .


답변

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
}

확장으로 :

extension UITextField {

    func fullTextWith(range: NSRange, replacementString: String) -> String? {

        if let fullSearchString = self.text, let swtRange = Range(range, in: fullSearchString) {

            return fullSearchString.replacingCharacters(in: swtRange, with: replacementString)
        }

        return nil
    }
}

// Usage:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if let textFieldString = textField.fullTextWith(range: range, replacementString: string) {
        print("FullString: \(textFieldString)")
    }

    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];