iPadには、iPhone / iPodのような「テンキー」キーボードがありません。
0から9までの値のみを受け入れるようにユーザーのキーボードを制限する方法を探しています。
UITextFieldの「shouldChangeCharactersInRange」を使用することを想像しますが、それを実装するための最良の方法がわかりません。
iPadには、iPhone / iPodのような「テンキー」キーボードがありません。
0から9までの値のみを受け入れるようにユーザーのキーボードを制限する方法を探しています。
UITextFieldの「shouldChangeCharactersInRange」を使用することを想像しますが、それを実装するための最良の方法がわかりません。
回答:
これは、SSN検証フィールドで問題を処理する方法ですif。必要に応じて、最大長を変更し、キーボードタイプのステートメントチェックを削除できます。
データを貼り付けるのではなく、ユーザーが入力しているときに最大長のアラートを抑制するロジックもあります。
このコードのコンテキスト内には、渡されたメッセージ文字列を使用して(またはレガシー)をpresentAlert()/presentAlert:提示する基本的な関数があります。UIAlertControllerUIAlertView
// 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.
//
// There are also some better stylistic approaches in Swift to avoid all the 
// nested statements, but I wanted to keep the styles similar to allow others 
// to contrast and compare between the two languages a little easier.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // Handle backspace/delete
    guard !string.isEmpty else {
        // Backspace detected, allow text change, no need to process the text any further
        return true
    }
    // Input Validation
    // Prevent invalid character input, if keyboard is numberpad
    if textField.keyboardType == .numberPad {
        // Check for invalid input characters
        if CharacterSet(charactersIn: "0123456789").isSuperset(of: CharacterSet(charactersIn: string)) {
            // Present alert so the user knows what went wrong
            presentAlert("This field accepts only numeric entries.")
            // Invalid characters detected, disallow text change
            return false
        }
    }
    // Length Processing
    // Need to convert the NSRange to a Swift-appropriate type
    if let text = textField.text, let range = Range(range, in: text) {
        let proposedText = text.replacingCharacters(in: range, with: string)
        // Check proposed text length does not exceed max character count
        guard proposedText.count <= maxCharacters else {
            // Present alert if pasting text
            // easy: pasted data has a length greater than 1; who copy/pastes one character?
            if string.count > 1 {
                // Pasting text, present alert so the user knows what went wrong
                presentAlert("Paste failed: Maximum character count exceeded.")
            }
            // Character count exceeded, disallow text change
            return false
        }
        // 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, etc)
        answerButton.isEnabled = (proposedText.count == 4)
    }
    // Allow text change
    return true
}
// 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
{
    // Handle backspace/delete
    if (!string.length)
    {
        // Backspace detected, allow text change, no need to process the text any further
        return YES;
    }
    // Input Validation
    // Prevent invalid character input, if keyboard is numberpad
    if (textField.keyboardType == UIKeyboardTypeNumberPad)
    {
        if ([string rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet].invertedSet].location != NSNotFound)
        {
            [self presentAlert: @"This field accepts only numeric entries."];
            return NO;
        }
    }
    // Length Validation
    NSString *proposedText = [textField.text stringByReplacingCharactersInRange:range withString:string];
    // Check proposed text length does not exceed max character count
    if (proposedText.length > maxCharacters)
    {
        // Present alert if pasting text
        // easy: pasted data has a length greater than 1; who copy/pastes one character?
        if (string.length > 1)
        {
            // Pasting text, present alert so the user knows what went wrong
            [self presentAlert: @"Paste failed: Maximum character count exceeded."];
        }
        // Character count exceeded, disallow text change
        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, etc)
    self.answerButton.enabled = (proposedText.length == maxCharacters);
    // Allow text change
    return YES;
}
このコードを使用して、textFieldに数値のみを許可できます。
その前にtextFieldのデリゲートを設定します
      textFieldName.delegate=self;
または
      [textFieldName setDelegate:self];
このコードを使用して、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;
    }
[string intValue]、@ "0"の場合は0を返します。したがってif ([string intValue])、@ "0"の場合は満たされません。使用する方が良いif ([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
                    @".".intValueは0@"0".intValueです。そして0でもあります。
                    0)文字を入力することはできません。
                    テキストフィールドのクリアの問題を回避するためにこれを試してください
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
}
return guard CharacterSet(charactersIn: "0123456789").isSuperset(of: CharacterSet(charactersIn: string))
                    Swiftコードの非常に具体的な手順
プロトコルをfunc textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool実装することにより、メソッドへのテキストフィールドの入力を制限するロジックを提供できUITextFieldDelegateます。
明確にするために、これらのステップは、あなたのストーリーボードが含まれているとビューコントローラを持つテキストフィールドを数字のみを受け入れるべきオブジェクト。
を拡張するViewControllerのカスタムクラスを作成しますUIViewController。XcodeのIdentityInspectorでカスタムクラス値を設定して、ストーリーボードのシーンがカスタムクラスを参照していることを確認します。
import UIKit
class YourCustomController: UIViewController {
    override func viewDidLoad() {        
        super.viewDidLoad()
    }
}
シーンのテキストフィールドからカスタムViewControllerへのアウトレットを作成します。
class YourCustomController: UIViewController {
    @IBOutlet weak var numberField: UITextField!
    ...
}
UITextFieldDelegateカスタムViewControllerでプロトコルを適用します。
class YourCustomController: UIViewController, UITextFieldDelegate {
    ...
}
カスタムViewControllerのviewDidLoadメソッドで、テキストフィールドのデリゲートをカスタムViewControllerクラスに割り当てます。
override func viewDidLoad() {        
    super.viewDidLoad()
    numberField.delegate = self
}
追加します UITextFieldDelegateのfunc textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Boolメソッドます。
numberField前の手順でカスタムViewControllerをデリゲートにした結果、このメソッドは、ユーザーがテキストフィールドに文字を入力するたびに呼び出されます。メソッドが戻るtrueと、文字はテキストフィールドに残ります。メソッドが返される場合falseと、文字はテキストフィールドに残りません。
stringパラメータは、ユーザーによって入力された文字です。string文字をに変換できる場合Intは、0から9の間です。それ以外の場合は、数字以外の文字です。
class YourCustomController: UIViewController, UITextFieldDelegate {
    ...
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        return Int(string) != nil
    }
}
(完全なビューコントローラーコードについては、以下を参照してください。)
数字のみのテキストフィールドを持つViewControllerの例
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
    }    
}
10進数のテキストフィールドを持つViewControllerの例
10進数をサポートしたい場合は、を利用してください  NSNumberFormatter。違いについては、コードコメントを参照してください。
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
    }    
}
return string.toInt() != nil  チャームのように働いた。ありがとう!
                    return Int(string) != nil
                    return string == "" || Int(string) != nil
                    - (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;
}
これを適用して動作します!!
-(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;                                                                                                                                     
}
if (character < 48) return NO; // 48 unichar for 0     if (character > 57) return NO; // 57 unichar for 9とif ((character < 48 || character > 57) && character != 46)私はさらにあなたが比較推薦character進数が最も一般的にこのような状況で使用されている数値を16進数で表現します。すなわちif ((character < 0x30 || character > 0x39) && character != 0x2E)
                    NSString* val = [[textField text] stringByReplacingCharactersInRange:range withString:string];
    NSCharacterSet *allowedCharacterSet = [NSCharacterSet decimalDigitCharacterSet];
    if ([[string componentsSeparatedByCharactersInSet:[allowedCharacterSet invertedSet]] count] > 1 || [val length] > 5) {
        return NO;
    }
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;
    }
迅速な5
    //MARK:- UITextFieldDelegate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let allowedCharacters = "1234567890"
    let allowedCharcterSet = CharacterSet(charactersIn: allowedCharacters)
    let typedCharcterSet = CharacterSet(charactersIn: string)
    return allowedCharcterSet.isSuperset(of: typedCharcterSet)
}
1234567890のみをタップできるようになりました
内部表現とは異なるプレゼンテーションデータを保持します。もっと簡単な方法があります。NSNumberFormatter仕事をしましょう:
 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]]];
私の仕様パターンを使用すると、コードは次のようになります
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
}
@iDevの回答を、デジタルと「。」で機能するように変更しました。
-(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; 
 }
迅速な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
    }
このコードを使用します:
NSString* val = [[textField text] stringByReplacingCharactersInRange:range withString:string];
NSCharacterSet *allowedCharacterSet = [NSCharacterSet decimalDigitCharacterSet];
if ([[string componentsSeparatedByCharactersInSet:[allowedCharacterSet invertedSet]] count] > 1 || [val length] > 5) {
    return NO;
}