2017-09-18 1 views
0

Wie kann ich die maximale Länge von UITextField in Alert einstellen?Swift 4 UITextField maximale Länge in Alert

Was ist die neueste Best Practice dafür in Swift 4?

Dies ist mein Codebeispiel, aber es wird abstürzen, weil UITextField am Anfang nicht existiert.

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 

} 

Vielen Dank für Ihre Zeit.

Antwort

0

Sie müssen tatsächlich keine Instanz der UITextField erstellen. Die addTextField Schließung wird die UITextField für Sie zurückgeben. Sie müssen lediglich den Delegaten dieses Textfelds im Abschluss festlegen.

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 
    } 
} 

Sie können diese Klasse für mehr als ein Textfeld verwenden. Fügen Sie einfach die Klasse MaxLengthTextField zu einem beliebigen Textfeld hinzu. Dann können Sie eine Anzahl von Zeichen im Textfeld vom Storyboard ändern. Ps.s. das ist swift 3.0

+0

Bitte geben Sie eine Erklärung für den Code –

+0

Okay, Sie können diese Klasse für mehr als ein Textfeld verwenden. Fügen Sie einfach die Klasse MaxLengthTextField zu einem beliebigen Textfeld hinzu. Dann können Sie eine Anzahl von Zeichen im Textfeld vom Storyboard ändern. Ps.s. Das ist schnell 3,0 –

+0

Vielen Dank. Können Sie die Antwort bearbeiten? Dann wird es für Leute hilfreich sein, die es lesen. Ich werde dann upvote –