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

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

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

Единственное, что мне нужно было скомпилировать, - это предложение, сделанное @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)
}

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


person Robert    schedule 28.06.2019    source источник
comment
на какой строке у тебя эта ошибка?   -  person NSGangster    schedule 28.06.2019
comment
@NSGangster Я не включил другую функцию, которую я использовал, чтобы попытаться сделать это, но когда я включил ее, произошла ошибка в строке «» FirstBox.delegate = self «». Функция, которую я пытался использовать, была предложена Акбаром Ханом в теме, которую я предоставил.   -  person Robert    schedule 28.06.2019
comment
Убедитесь, что ваша розетка подключена к UITextField.   -  person vacawama    schedule 28.06.2019


Ответы (2)


Попробуй это

  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
    }
person s4salman    schedule 28.06.2019

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

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

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

    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. Для получения дополнительной информации о различных типах целых чисел в swift проверьте это.

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

person NSGangster    schedule 28.06.2019