Zezwalaj tylko na liczby dla wejścia UITextField
IPad nie ma klawiatury "Numpad" jak iPhone/iPod.
Szukam sposobu na ograniczenie klawiatury użytkownika do akceptowania tylko wartości od 0 do 9.
Wyobrażam sobie użycie uitextfielda "shouldChangeCharactersInRange", ale nie wiem, jak najlepiej to zaimplementować.
13 answers
W ten sposób poradziłem sobie z problemem w polu weryfikacji SSN, możesz zmodyfikować maksymalną długość i usunąć if
polecenie sprawdzania typu klawiatury, jeśli zajdzie taka potrzeba.
Istnieje również logika tłumiąca alerty o maksymalnej długości, gdy użytkownik wpisuje, w przeciwieństwie do wklejania danych.
W kontekście tego kodu, BasicAlert()
jest makrem #define
, które po prostu pokazuje UIAlertView
lub UIAlertController
używając przekazywanych ciągów tytułu i wiadomości.
// NOTE: This code assumes you have set the UITextField(s)'s delegate property to the object that will contain this code, because otherwise it would never be called.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// allow backspace
if (!string.length)
{
return YES;
}
// Prevent invalid character input, if keyboard is numberpad
if (textField.keyboardType == UIKeyboardTypeNumberPad)
{
if ([string rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet].invertedSet].location != NSNotFound)
{
// BasicAlert(@"", @"This field accepts only numeric entries.");
return NO;
}
}
// verify max length has not been exceeded
NSString *proposedText = [textField.text stringByReplacingCharactersInRange:range withString:string];
if (proposedText.length > 4) // 4 was chosen for SSN verification
{
// suppress the max length message only when the user is typing
// easy: pasted data has a length greater than 1; who copy/pastes one character?
if (string.length > 1)
{
// BasicAlert(@"", @"This field accepts a maximum of 4 characters.");
}
return NO;
}
// only enable the OK/submit button if they have entered all numbers for the last four of their SSN (prevents early submissions/trips to authentication server)
self.answerButton.enabled = (proposedText.length == 4);
return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-20 07:01:26
Możesz użyć tego kodu, aby zezwolić tylko na numer w polu tekstowym.
Przed tym ustawionym delegatem dla textField
textFieldName.delegate=self;
Lub
[textFieldName setDelegate:self];
Następnie użyj tego kodu, aby zezwolić tylko digit na textField
- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString: (NSString *)string {
//return yes or no after comparing the characters
// allow backspace
if (!string.length)
{
return YES;
}
////for Decimal value start//////This code use use for allowing single decimal value
// if ([theTextField.text rangeOfString:@"."].location == NSNotFound)
// {
// if ([string isEqualToString:@"."]) {
// return YES;
// }
// }
// else
// {
// if ([[theTextField.text substringFromIndex:[theTextField.text rangeOfString:@"."].location] length]>2) // this allow 2 digit after decimal
// {
// return NO;
// }
// }
////for Decimal value End//////This code use use for allowing single decimal value
// allow digit 0 to 9
if ([string intValue])
{
return YES;
}
return NO;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-15 12:20:18
Bardzo szczegółowe kroki dla kodu Swift
Możesz podać logikę, która ogranicza wprowadzanie pola tekstowego w metodzie func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
poprzez implementację protokołu UITextFieldDelegate
.
Dla jasności, te kroki zakładają, że Twój storyboard zawiera kontroler widoku z pole tekstowe obiekt, który powinien akceptować tylko cyfry.
-
Utwórz klasę niestandardową dla kontrolera widoku, która rozszerza
UIViewController
. Make na pewno, że scena w storyboardzie odnosi się do niestandardowej klasy, ustawiając wartość niestandardowej klasy w Inspektorze tożsamości Xcode.import UIKit class YourCustomController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } }
-
Utwórz wyjście z pola tekstowego sceny do niestandardowego kontrolera widoku.
class YourCustomController: UIViewController { @IBOutlet weak var numberField: UITextField! ... }
-
Zastosuj protokół
UITextFieldDelegate
w niestandardowym kontrolerze widoku.class YourCustomController: UIViewController, UITextFieldDelegate { ... }
-
W metodzie kontrolera widoku niestandardowego
viewDidLoad
Przypisz delegata pola tekstowego do kontrolera widoku niestandardowego klasy.override func viewDidLoad() { super.viewDidLoad() numberField.delegate = self }
-
Dodaj metodę
UITextFieldDelegate
'Sfunc textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
.W wyniku uczynienia własnego kontrolera widoku delegatem
numberField
w poprzednim kroku, metoda ta będzie wywoływana za każdym razem, gdy użytkownik wprowadzi znak do pola tekstowego. Jeśli twoja metoda zwrócitrue
, znak pozostanie w polu tekstowym. Jeśli twoja metoda zwrócifalse
, to znak Nie pozostanie w polu tekstowym.Parametrem
string
jest znak będący wprowadzone przez użytkownika. Jeśli znakstring
można przekonwertować naInt
, to znajduje się pomiędzy 0 a 9; w przeciwnym razie jest to jakiś znak nie-liczbowy.class YourCustomController: UIViewController, UITextFieldDelegate { ... func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { return Int(string) != nil } }
(patrz poniżej Pełny kod kontrolera widoku.)
Przykładowy kontroler widoku z polem tekstowym tylko cyframi
import UIKit
class YourCustomController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var numberField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
numberField.delegate = self
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return Int(string) != nil
}
}
Przykładowy kontroler widoku z polem dziesiętnym
Jeśli chcesz poprzeć liczbę dziesiętną, skorzystaj z NSNumberFormatter
. Zobacz kod komentarze do różnic.
import UIKit
class YourCustomController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var numberField: UITextField!
private var formatter: NSNumberFormatter!
override func viewDidLoad() {
super.viewDidLoad()
numberField.delegate = self
// Initialize the formatter; minimum value is set to zero; style is Decimal.
formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
formatter.minimum = 0
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
// Combine the current text field value and the new string
// character. If it conforms to the formatter's settings then
// it is valid. If it doesn't then nil is returned and the
// string character should not be allowed in the text field.
return formatter.numberFromString("\(textField.text)\(string)") != nil
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-04 14:07:05
Spróbuj uniknąć problemu z czyszczeniem pola tekstowego
Swift 3.0
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard NSCharacterSet(charactersInString: "0123456789").isSupersetOfSet(NSCharacterSet(charactersInString: string)) else {
return false
}
return true
}
Swift 4.0
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard CharacterSet(charactersIn: "0123456789").isSuperset(of: CharacterSet(charactersIn: string)) else {
return false
}
return true
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 09:54:35
- (BOOL) textField: (UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString: (NSString *)string {
NSNumberFormatter * nf = [[NSNumberFormatter alloc] init];
[nf setNumberStyle:NSNumberFormatterNoStyle];
NSString * newString = [NSString stringWithFormat:@"%@%@",textField.text,string];
NSNumber * number = [nf numberFromString:newString];
if (number)
return YES;
else
return NO;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-03 19:07:40
Zastosowałem to i działa!!
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
// Check for non-numeric characters
NSUInteger lengthOfString = string.length;
for (NSInteger index = 0; index < lengthOfString; index++) {
unichar character = [string characterAtIndex:index];
if (character < 48) return NO; // 48 unichar for 0
if (character > 57) return NO; // 57 unichar for 9
}
// Check total length for restrict user
NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
if (proposedNewLength > 6)
return YES;
return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-22 15:35:50
NSString* val = [[textField text] stringByReplacingCharactersInRange:range withString:string];
NSCharacterSet *allowedCharacterSet = [NSCharacterSet decimalDigitCharacterSet];
if ([[string componentsSeparatedByCharactersInSet:[allowedCharacterSet invertedSet]] count] > 1 || [val length] > 5) {
return NO;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 17:55:11
Works fine for me :
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound) && !(range.length==1 && string.length==0)) {
return NO;
}
return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 06:38:19
Zachowaj odrębne dane Prezentacji z wewnętrznej reprezentacji. Jest prostszy sposób. Let NSNumberFormatter
do the job:
NSNumberFormatter* ns = [[NSNumberFormatter alloc] init];
ns.numberStyle = NSNumberFormatterDecimalStyle;
[ns setMaximumFractionDigits:2];
// This is your internal representation of the localized number
double a = [[ns numberFromString:self.textIVA.text] doubleValue]];
[mylabel setText:[NSString stringWithFormat:@"€ %@",
[NSNumberFormatter localizedStringFromNumber:
[NSNumber numberWithDouble:a]
numberStyle:NSNumberFormatterDecimalStyle]]];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-14 12:53:45
Jeśli używasz mojego wzoru specyfikacji wtedy kod wygląda tak
textField.delegate = self
lazy var specification: Specification = {
return RegularExpressionSpecification(pattern: "^(|0|[1-9]\\d{0,6})$")
}()
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let textFieldString: NSString = textField.text ?? ""
let s = textFieldString.stringByReplacingCharactersInRange(range, withString:string)
return specification.isSatisfiedBy(s)
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
let s = textField.text ?? ""
let isTextValid = specification.isSatisfiedBy(s)
if isTextValid {
textField.resignFirstResponder()
}
return false
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-17 17:23:12
Zmodyfikowałem odpowiedź @ iDev na pracę dla digitali i ".":
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
// Check for non-numeric characters
NSUInteger lengthOfString = string.length;
for (NSInteger index = 0; index < lengthOfString; index++) {
unichar character = [string characterAtIndex:index];
if ((character < 48) && (character != 46)) return NO;
// 48 unichar for 0, and 46 unichar for point
if (character > 57) return NO;
// 57 unichar for 9
}
// Check for total length
NSUInteger proposedNewLength = textField.text.length - range.length + string.length;
if (proposedNewLength > 6)
return YES;
return YES;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-12 09:39:53
Swift 3
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField==yourTextFieldOutlet {
if(CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: yourTextFieldOutlet.text!))){
//if numbers only, then your code here
}
else{
showAlert(title: "Error",message: "Enter Number only",type: "failure")
}
}
return true
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-16 08:20:26
Użyj tego kodu:
NSString* val = [[textField text] stringByReplacingCharactersInRange:range withString:string];
NSCharacterSet *allowedCharacterSet = [NSCharacterSet decimalDigitCharacterSet];
if ([[string componentsSeparatedByCharactersInSet:[allowedCharacterSet invertedSet]] count] > 1 || [val length] > 5) {
return NO;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 10:40:44