Попытка заставить TextField принимать только целочисленные значения, а затем включить кнопку, чтобы перейти к следующему экрану - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь создать простое приложение в Xcode, которое будет вычислять цифры Pi до определенной цифры (то есть сотой цифры) и показывать время, необходимое для этого. Первый шаг, с которым я сталкиваюсь, заключается в том, что я хочу иметь TextField, который принимает только целочисленное значение, и когда это условие будет выполнено, тогда кнопка «запустить» программу будет разрешена для нажатия. Для всех других условий, я хотел бы, чтобы была выдана ошибка: «Для продолжения необходимо ввести целочисленное значение». но мне трудно понять, почему это так.

Я последовал совету из этой нити , но постоянно получаю сообщение об ошибке: «Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при неявном развертывании необязательного значения» со всеми указанными параметрами.

Единственное, что я получил для компиляции, было предложение @Naishta, которое все остальные дали мне ту ошибку, о которой я упоминал ранее. Вот мой код, который я могу компилировать:

    @IBOutlet weak var FirstBox: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        //FirstBox.delegate = self
    }

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

        guard let _ = Int(string) else {
            button.isEnabled = false
            enum MyError: Error {
                case runtimeError(String)
            }
            return false
        }
        button.isEnabled = true
        return true
    }

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

@IBAction func StartCalc(_ sender: Any) {
self.performSegue(withIdentifier: "CalcSegue", sender: self)
}

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

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Несколько вещей:

  1. Если вы вернете false из shouldChangeCharactersInRange, UITextField не обновится.Если вы хотите, чтобы пользователь ввел неверный ввод, всегда возвращайте true.

  2. Вы проверяете только строку замены для Int, если пользователь вводит 4 с уже введенным текстом 123 вы проверяете, является ли 4 целым числом, когда, возможно, вы хотите проверить 1234.Даже если они нажмут BACKSPACE, вы будете пытаться привести пустую строку к Int, которая всегда будет неудачной, вернет false, и пользователь никогда не сможет удалить символ.Я настоятельно рекомендую вам следовать этому ТАКому сообщению, чтобы получить полную строку.И это будет выглядеть примерно так:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
       let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
    
       //now we are comparing the full string, not the replacement string.
       if let _ = Int(newString) {
          button.isEnabled = true
       } else {
           //We can still disable our button and throw runtime error, but still allow text to change.
           button.isEnabled = false
           //You are declaring an enum here, but not throwing an error?
           enum MyError: Error {
               case runtimeError(String)
           }
       }
       return true
    }
    
  3. Вы также можете более или менее запретить пользователю (за исключением операции вставки) вводить нецелое значение, если выустановите

    textField.keyboardType = .numberPad

  4. Если вы используете Int, максимальное значение, которое ваш пользователь может добавить - 2147483647, прежде чем оно будет усечено влево, и вы получитеотрицательное значение int.Либо проверьте это, либо удвойте сумму / предотвратите отрицательное значение, используя беззнаковое целое UInt.Еще лучше, если вы хотите ОГРОМНЫЕ номера, UInt64 даст вам от 0 до 18,446,744,073,709,551,615.Для получения дополнительной информации о различных типах целых чисел в быстрой проверке this out.

  5. Возможно, вы получаете ошибку времени выполнения для нулевой ссылки на объект, если ваша UITextView розеткане правильно подключен к раскадровке.

0 голосов
/ 28 июня 2019

Попробуйте это

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

        let set = CharacterSet.init(charactersIn: "01234567890").inverted

        if string.rangeOfCharacter(from: set) != nil {

            return false
        }
        button.isEnabled = true

        return true
    }
...