Ограничить ввод текстового поля в UIAlertController, когда пользователь вводит с помощью swift?

Я нашел этот пример кода о том, как добавить текстовое поле для UIAlertController, но я не могу ограничить пользователей вводом только 10 символов в качестве ограничения, у меня есть функция для удаления последнего символа при его переходе, когда редактирование изменено для обычного текстового поля, но невозможно проверить текстовое поле на UIAlertController.

//Function to Remove the last character

func trimStr(existStr:String)->String{

    var countExistTextChar = countElements(existStr)

    if countExistTextChar > 10 {
        var newStr = ""
        newStr = existStr.substringToIndex(advance(existStr.startIndex,(countExistTextChar-1)))
        return newStr

    }else{
        return existStr
    }

}

 var inputTextField: UITextField?

    //Create the AlertController
    let actionSheetController: UIAlertController = UIAlertController(title: "Alert", message: "Swiftly Now! Choose an option!", preferredStyle: .Alert)

    //Create and add the Cancel action
    let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
        //Do some stuff
    }
    actionSheetController.addAction(cancelAction)
    //Create and an option action
    let nextAction: UIAlertAction = UIAlertAction(title: "Next", style: .Default) { action -> Void in


    }
    actionSheetController.addAction(nextAction)
    //Add a text field
    **actionSheetController.addTextFieldWithConfigurationHandler { textField -> Void in
        //TextField configuration
        textField.textColor = UIColor.blueColor()

        inputTextField = textField**


    }

    //Present the AlertController
    self.presentViewController(actionSheetController, animated: true, completion: nil)

Спасибо.


person user2449557    schedule 18.01.2015    source источник


Ответы (1)


Вы можете установить делегата текстового поля контроллера предупреждений, как, например, показано здесь https://stackoverflow.com/a/24852979/1187415:

actionSheetController.addTextFieldWithConfigurationHandler { [weak self] textField -> Void in
    //TextField configuration
    textField.textColor = UIColor.blueColor()
    textField.delegate = self
}

Обратите внимание, что вам нужно добавить протокол UITextFieldDelegate в определение вашего контроллера представления, чтобы выполнить эту компиляцию:

class ViewController: UIViewController, UITextFieldDelegate {
    // ...

Затем вы реализуете метод делегата shouldChangeCharactersInRange, который вызывается всякий раз, когда текст должен измениться в ответ на действия пользователя. Он может вернуть true или false, чтобы разрешить изменение или отклонить его.

Существуют различные примеры того, как ограничить длину текстового поля в этом методе делегата, вот одна из возможных реализаций:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange,
    replacementString string: String) -> Bool {
        let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString
        return newString.length <= 10
}

Это приведет к игнорированию ввода, если длина текстового поля будет больше 10. В качестве альтернативы вы всегда можете обрезать ввод до 10 символов:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange,
    replacementString string: String) -> Bool {
        let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
        textField.text = trimStr(newString)
        return false
}

Недостатком второго метода является то, что курсор всегда переходит в конец текстового поля, даже если текст вставлен где-то посередине.

person Martin R    schedule 18.01.2015