سؤال

لدي UITextField في التطبيق.أود أن تحد من مجموعة من الأحرف التي يمكن إدخالها في هذا المجال إلى مجموعة التي حددت.أنا يمكن أن تصفية الشخصيات إدخالها في الحقل عندما ترتكب باستخدام UITextFieldDelegate الطريقة:

- (BOOL)textFieldShouldReturn:(UITextField*)textField

ومع ذلك ، فإن هذا يعطي المستخدم انطباعا خاطئا وعلى الرغم من أن تقييد الأحرف يتم إزالتها من القيمة النهائية, كانت لا تزال واضح دخلت في حقل النص قبل الضغط عودة/به/.... الخما هو أفضل نهج من شأنه منع تقييد الشخصيات التي تظهر في حقل النص كما يتم اختيارهم على لوحة المفاتيح ؟

ملاحظة: أنا على افتراض أن لدي القليل من السيطرة على المفاتيح التي يتم توفيرها من قبل اي فون لوحة المفاتيح(s).أنا على علم بأنني يمكن التبديل بين مختلف تطبيقات لوحة المفاتيح ولكن أنا تحت انطباع بأن لا يمكنني تعطيل مفاتيح معينة.قد يكون هذا الافتراض غير صحيح.

هل كانت مفيدة؟

المحلول

انظر textField:shouldChangeCharactersInRange

ويسمى هذا الأسلوب من قبل UITextFieldDelegate كلما شخصيات جديدة يتم كتابتها أو الشخصيات الموجودة يتم حذفها من حقل النص.هل يمكن أن نعود إلى لا تسمح بالتغيير.

نصائح أخرى

فعلت كما marcc اقترح وانها عملت بشكل جيد.عينة تنفيذ يلي.

ملاحظة: أسماء المتغيرات تم اختيار الإيجاز و لا تعكس معايير الترميز:

    ...
    myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"xyzXYZ"];
    ...
}

- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered {
    for (int i = 0; i < [textEntered length]; i++) {
        unichar c = [textEntered characterAtIndex:i];
        if (![myCharSet characterIsMember:c]) {
            return NO;
        }
    }
    return YES;
}

هنا هو واحد من أنظف نهج تقييد الأحرف التي تم إدخالها في UITextField.هذا النهج يتيح استخدام عدة مسبقا NSCharacterSets.

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    NSMutableCharacterSet *allowedCharacters = [NSMutableCharacterSet alphanumericCharacterSet];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]];

    if([string rangeOfCharacterFromSet:allowedCharacters.invertedSet].location == NSNotFound){

        return YES;

    }

    return NO;

}

نظرة على UITextViewDelegate طريقة - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string.

انها بالضبط ما تحتاجه.

هذا هو ما يمكنني استخدام تقييد المستخدم إلى أحرف كبيرة من الألف إلى الياء.ضبط regex متغير حسب الذوق:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString* regex = @"[^A-Z]";
    return ([string rangeOfString: regex
                      options:NSRegularExpressionSearch].location == NSNotFound);
};

ماذا عن هذا ؟

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString* regex = @"[^a-z]";
    return ([[string lowercaseString] rangeOfString: regex
                      options:NSRegularExpressionSearch].location == NSNotFound);
};

ملاحظة:

وأنا على صنع كل الشخصيات إلى انخفاض الحالة [string lowercaseString] بحيث لا تحتاج إلى كتابة في regex على captial/الحروف الصغيرة.

هل يمكن أن حلقة والحفاظ على التحقق إذا كان UITextField.النص الملكية تغيرت مرة واحدة DidBeginEditing طريقة يحصل تسمى.إذا كان قد تحقق النص وإزالة شخصيات سيئة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top