`textField : shouldChangeCharactersInRange :`를 사용하여 현재 입력 된 문자를 포함하는 텍스트를 어떻게 얻습니까?


116

아래 코드를 사용하여 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"입니다.

내가 뭘 잘못하고 있죠?


8
항상 "Editing Changed"이벤트를 사용하는 것이 놀랍도록 더 쉽습니다 . .. IB에서 만든 함수로 드래그하기 만하면됩니다.
Fattie dec

편집 변경 이벤트는 프로그래밍 방식으로 생성 된 텍스트 변경 이벤트 (예 : 자동 수정 / 자동 완성 / 텍스트 교체)를 캡처하지 않습니다.

답변:


272

-shouldChangeCharactersInRange텍스트 필드가 실제로 텍스트를 변경 하기 전에 호출 되기 때문에 이전 텍스트 값을 얻는 것입니다. 업데이트 사용 후 텍스트를 얻으려면 :

[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];

15
이것은 거의 나를 위해 일했습니다. 문자를 입력하면 작동했습니다. 삭제 버튼을 누르면 두 글자가 삭제됩니다. 저에게는 다음과 같은 제안이 적용되었습니다. stackoverflow.com/questions/388237/… 기본적으로 UITextField에서 코드로 끌어다 놓은 다음 (함수를 만들기 위해) TextField를 마우스 오른쪽 단추로 클릭하고 끌어다 놓습니다. "Editing Changed"에 대한 원에서 새 기능으로 드롭합니다. (한숨. 가끔 Visual Studio가 그리워요 ..)
Mike Gledhill 2013 년

나는 또한 이것이 유효한 대답이라고 생각하지만 대답은 아닙니다. 가장 좋은 방법은 당신이 @tomute 응답 한 원하는 것을 달성하기
페드로 보르헤스에게

5
또는 textFiel.text = (textFiel.text as NSString) .stringByReplacingCharactersInRange (range, withString : string) in Swift
Max

프로그래밍 방식으로 같은 일을 할 수 @MikeGledhill :[textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged]
스티브 모저

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

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

40

스위프트 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이 경우에는.


replacingCharacters이어야합니다stringByReplacingCharactersInRange
Alan Scarpa 2016

1
@Alan_s Xcode 프로젝트에서 직접이 스 니펫을 복사했는데 제대로 작동했습니다. iOS 10.1을 대상으로 Xcode 8.1을 사용하고 있습니까?
focorner 2011


13

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
}

8

그것을위한 스위프트 버전 :

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
}

5

이것이 필요한 코드입니다.

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

1

가드 사용

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
    }

0

내 해결책은 UITextFieldTextDidChangeNotification.

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

전화하는 것을 잊지 마세요 [[NSNotificationCenter defaultCenter] removeObserver:self];dealloc방법.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.