2017-09-18 11 views
0

アラートでUITextFieldの最大長を設定するにはどうすればよいですか?Swift 4 UITextFieldアラートの最大長

スウィフト4の最新のベストプラクティスは何ですか?

これは私のコード例ですが、UITextFieldが最初に存在しないためにクラッシュします。

class ViewController: UIViewController, UITextFieldDelegate { 
@IBOutlet weak var textField: UITextField! 
let limitLength = 10 
@IBOutlet weak var player1: UIButton! 


func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    guard let text = textField.text else { return true } 
    let newLength = text.characters.count + string.characters.count - range.length 
    return newLength <= limitLength 
} 

@IBAction func player1Action(_ sender: UIButton) { 
    let alertController = UIAlertController(title: "Please enter you name", message: "Maximum 10 characters", preferredStyle: .alert) 
    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { 
     alert -> Void in 
     let textField = alertController.textFields![0] as UITextField 
     // do something with textField 
     self.player1.setTitle("\(textField.text!)", for: .normal) 
    })) 
    alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 

    alertController.addTextField(configurationHandler: {(textField : UITextField!) -> Void in 
     textField.placeholder = "Name" 
    }) 
    self.present(alertController, animated: true, completion: nil) 

} 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    textField.delegate = self 

} 

お時間をいただきありがとうございます。

答えて

0

実際にUITextFieldのインスタンスを作成する必要はありません。 addTextFieldクロージャはUITextFieldを返します。あなたがする必要があるのは、そのテキストフィールドのデリゲートをクロージャーに設定することだけです。あなたが複数のテキストフィールドに、このクラスを使用することができます

class ViewController: UIViewController, UITextFieldDelegate { 
    let limitLength = 10 
    @IBOutlet weak var player1: UIButton! 

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     guard let text = textField.text else { return true } 
     let newLength = text.characters.count + string.characters.count - range.length 
     return newLength <= limitLength 
    } 

    @IBAction func player1Action(_ sender: UIButton) { 
     let alertController = UIAlertController(title: "Please enter you name", message: "Maximum 10 characters", preferredStyle: .alert) 
     alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { 
      alert -> Void in 
      let textField = alertController.textFields![0] as UITextField 
      self.player1.setTitle("\(textField.text!)", for: .normal) 
     })) 
     alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 

     alertController.addTextField(configurationHandler: {(textField : UITextField!) -> Void in 
      textField.placeholder = "Name" 
      textField.delegate = self // Set the delegate 
     }) 

     present(alertController, animated: true, completion: nil) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 
1
class MaxLengthTextField: UITextField, UITextFieldDelegate { 

    private var characterLimit: Int? 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     delegate = self 
    } 

    @IBInspectable var maxLength: Int { 
     get { 
      guard let length = characterLimit else { 
       return Int.max 
      } 
      return length 
     } 
     set { 
      characterLimit = newValue 
     } 
    } 

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

     guard string.characters.count > 0 else { 
      return true 
     } 

     let currentText = textField.text ?? "" 
     let prospectiveText = (currentText as NSString).replacingCharacters(in: range, with: string) 

     // 1. Here's the first change... 
     return allowedIntoTextField(text: prospectiveText) 
    } 

    // 2. ...and here's the second! 
    func allowedIntoTextField(text: String) -> Bool { 
     return text.characters.count <= maxLength 
    } 
} 

。任意のテキストフィールドにクラスMaxLengthTextFieldを追加するだけです。次に、ストーリーボードからテキストフィールドの文字数を変更することができます。 P.S.これは迅速です3.0

+0

コードの説明を投稿してください –

+0

OKこのクラスは、複数のテキストフィールドに使用できます。任意のテキストフィールドにクラスMaxLengthTextFieldを追加するだけです。次に、ストーリーボードからテキストフィールドの文字数を変更することができます。 P.これは迅速です3.0 –

+0

ありがとうございます。あなたは答えを編集できますか?そうすれば、それを読んでいる人にとっては助けになるでしょう。私は –