`TextField: shouldChangeCharactersInRange:` kullanarak, mevcut yazılan karakteri içeren metni nasıl alabilirim?


116

Aşağıdaki kodu denemek ve kullanıcının textField2metin içeriğinin textField1kullanıcı her yazışında eşleşecek şekilde güncellenmesini sağlamak için kullanıyorum textField1.

- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {    
  if (theTextField == textField1){    
     [textField2 setText:[textField1 text]];    
  }
}

Ancak, gözlemlediğim çıktı şu ki ...

textField2, textField1 "123" olduğunda "12" olur

textField2, textField1 "1234" olduğunda "123" olur

... istediğim ne zaman:

textField2, textField1 "123" olduğunda "123" olur

textField2, textField1 "1234" olduğunda "1234" olur

Neyi yanlış yapıyorum?


8
"Değiştirilen Düzenleme" olayını her zaman kullanmanın şaşırtıcı derecede daha kolay olduğunu hatırlatmak isteriz .. bunu IB'ye yaptığınız bir işleve sürüklemeniz yeterlidir.
Fattie

Düzenleme değiştirilen olayının, program aracılığıyla oluşturulan herhangi bir metin değiştirme olayını, örneğin otomatik düzeltme / otomatik tamamlama / metin değiştirme gibi, yakalamadığını unutmayın.
şim

Yanıtlar:


272

-shouldChangeCharactersInRangemetin alanı aslında metnini değiştirmeden önce çağrılır , bu yüzden eski metin değerini alıyorsunuz. Güncellemeden sonra metni almak için:

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

15
Bu neredeyse benim için çalıştı. Bir karakter yazarsam bu işe yaradı. Sil düğmesine basarsam iki karakter silinirdi. Benim için şu öneri işe yaradı: stackoverflow.com/questions/388237/… Temel olarak, UITextField'den kodunuza sürükleyip bırakın (bir işlev oluşturmak için), ardından TextField'ınıza sağ tıklayın ve sürükleyin. yeni işleviniz için "Düzenleme Değiştirildi" için daireden bırakın. (İç çekme. Visual Studio'yu bazen özlüyorum ..)
Mike Gledhill

Ben de bunun geçerli bir cevap olduğunu hissediyorum, ancak yanıt değil. İstediğinizi başarmanın en iyi yolu @tomute tarafından yanıtlandı
Pedro Borges

5
Veya textFiel.text = (NSString olarak textFiel.text) .stringByReplacingCharactersInRange (range, withString: string) Swift
Fazla

@MikeGledhill Aynı şeyi programlı olarak yapabilirsiniz:[textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged]
Steve Moser

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

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

40

Hızlı 3

Kabul edilen cevaba göre, aşağıdakiler Swift 3'te çalışmalıdır :

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

    let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)

    return true
}

Not

Her ikisi de Stringve NSStringadı verilen yöntemler var replacingCharacters:inRange:withString. Bununla birlikte, beklendiği gibi, ilki bir örnek Rangebeklerken, ikincisi bir örnek bekler NSRange. textFieldTemsilci yöntemi kullanan NSRangeörneği, böylece kullanım NSString, bu durumda.


replacingCharactersolmalıstringByReplacingCharactersInRange
Alan Scarpa

1
@Alan_s Bu pasajı doğrudan Xcode projemden kopyaladım ve iyi çalışıyordu. İOS 10.1'i hedefleyen Xcode 8.1 kullanıyor musunuz?
focorner


13

Swift'de (4), NSString(saf Swift) olmadan :

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
}

Bir uzantı olarak:

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

Bunun için hızlı versiyon:

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

İhtiyacınız olan kod bu,

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

1

bekçi kullan

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

Benim çözümüm kullanmaktır UITextFieldTextDidChangeNotification.

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

Çağırmak unutma [[NSNotificationCenter defaultCenter] removeObserver:self];içinde deallocyöntemle.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.