textField разрешает все символы, несмотря на функцию ShouldChangeCharactersIn - PullRequest
0 голосов
/ 07 февраля 2019

Поскольку я пытаюсь усвоить код, который использовал в течение многих лет (без особого понимания), я создал свою версию, которая в теории должна копировать его назначение.У меня есть textField, в котором я допускаю только десятичные числа и один период - ".".Однако на данный момент мой textField позволяет вводить любой символ.

Я импортировал класс UITextFieldDelegate, соединил мой UITextField как выход и установил для моего текстового поля значение textFieldDelefate в viewDidLoad.

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

   //characterSet that holds digits
var allowed = CharacterSet.decimalDigits

//initialize the period for use as a characterSet
let period = CharacterSet.init(charactersIn: ".")

//adding these two characterSets together
allowed.formUnion(period)

//all the characters not in the allowed union
let inverted = allowed.inverted

//if latest input is from the characters not allowed is present (aka, empty), do not change the characters in the text range
if string.rangeOfCharacter(from: inverted) != nil
{
    return false
}
    //if the text already contains a period and the string contains one as well, do not change output
else if (textField.text?.contains("."))! && string.contains(".")
{
    return false
}
//however, if not in the inverted set, allow the string to replace latest value in the text
else
{
    return true
}

Эта функция не отключает более одного периода и инвертирует десятичные числа.

1 Ответ

0 голосов
/ 08 февраля 2019

Я, кажется, работаю для меня, я перенес некоторые настройки персонажа в некоторые ленивые переменные, так что это делается только один раз, а не каждый раз, когда вызывается делегат.

import UIKit

class ContainerController: UIViewController, UITextFieldDelegate {


    @IBOutlet weak var textField: UITextField!

    //characterSet that holds digits
    lazy var allowed:CharacterSet = {
        var allowed = CharacterSet.decimalDigits
        //initialize the period for use as a characterSet
        let period = CharacterSet.init(charactersIn: ".")
        //adding these two characterSets together
        allowed.formUnion(period)
        return allowed
    }()

    lazy var inverted:CharacterSet = {
        return allowed.inverted
    }()

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

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

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }


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

        print("shouldChangeCharactersIn", range)
        print("replacementString", string)
        //if latest input is from the characters not allowed is present (aka, empty), do not change the characters in the text range
        if string.rangeOfCharacter(from: inverted) != nil {
            return false
        } else if (textField.text?.contains("."))! && string.contains(".") {
            //if the text already contains a period and the string contains one as well, do not change output
            return false
        } else {
             //however, if not in the inverted set, allow the string to replace latest value in the text
            return true
        }
    }

}
...