در همه سیستم‌‌عامل‌های همراه مثل اندروید و آی‌او‌اس این امکان وجود داره که نوع کیبورد ظاهر شده برای مقدار دهی یک فیلد رو مشخص کنیم، مثلا اگر فیلد عددی باشه میتونیم کیبوردی رو نشون بدیم که فقط عدد داشته باشه و به این صورت بتونیم کاراکتر‌های وارد شده در این فیلد رو محدود کنیم. هرچند راه دررو در این حالت وجود داره ولی خب راه ساده‌ هست. مشکل وقتی بزرگ میشه که ما بخوایم همین برنامه رو توی دستگاه‌های بزرگتر (تبلت‌‌ها) اجرا کنیم، دلیل این امر هم اختلاف کیبوردهای موجود در این دستگاه‌ها است، مثلا در آیپد چیزی به اسم کیبورد عدد وجود نداره و کیبورد پیش فرض نشون داده میشه و این مشکل کاره.

در آی‌اواس اگر بخوایم جلوی این اتفاق رو بگیریم باید خودمون دست به کد بشیم و برای `UITextField` خودمون یک `UITextFieldDelegate` تعریف کنیم. اگر با تعریف `Delegate` و نحوه کار کردن و دلیل وجودی اون آشنا نیستید حتما حتما حتما بگردید و پیدا کنید و اطلاعات خودتون رو بالا ببرید در خیلی از موارد دلگیت روشن کننده راه هست توی `iOS`. برای رفع این مشکل اول کنترلر خودتون رو تبدیل به یک `delegate` برای تکست‌فیلد کنید و تابع `shouldChangeCharactersInRange` رو توی اون پیاده‌سازی کنید. کاری که باید انجام بدیم ساده است، باید کاراکتری که قراره به تکست فیلد ما اضافه بشه رو بررسی کنیم و اگر جزو کاراکتر‌های غیر مجاز بود در این تابع مقدار `false` برگردونیم. اگر هم مجاز بود `true`. خیلی جای حرف زدن نداره و بریم سراغ پیاده سازی تابع.

Objective-C

``` - (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSCharacterSet *myCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet]; NSRange r = [string rangeOfCharacterFromSet:s]; if (r.location != NSNotFound) { return NO; } return YES; } ```

Swift

``` func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let invalid = NSCharacterSet(charactersInString: "1234567890").invertedSet //characters to block if let _ = string.rangeOfCharacterFromSet(invalid) { return false } return true } ```