Падает приложение, т.к. находит nil


#1

Вообщем есть проблема, не могу понять что делаю не так.

Суть проблемы: В платном курсе (First App) swiftbook.ru - рассматривается создание простейшего приложения, которое определяет день недели по введенному числу, месяцу и году (3 текстфилда). Собственно я решил доделать это приложение, т.к. в данном уроке было применено небезопасное извлечение из опциональных переменных. И в случае определнных обстоятельств приложение будет падать.

Соответственно что у меня получилось:

  • Поставить ограничения по диапазону вводимых значений - День, Месяц, Год

Что у меня не получилось:

  • Избежать падения приложения, в случае если в одном из textField’oв пользователь ничего не введет (оставит поле пустым). Пробовал ставить guard dateComponents.day != nil { return } все равно не помогает.

Что делать, как быть


#2

Можно сам проект?..


#3

http://dropmefiles.com/M1hxR

Буду благодарен если поможете разобраться


#4

можно добавить:

guard day != "" && month != "" && year != "" else {return}

А еще хорошо бы удалять перед этим лишние пробелы в day, month и year
Например вот так.

let myDay = day.replacingOccurrences(of: " ", with: "")

ну и соответсвенно так же с месяцем и годом сделать.

Тогда если пользователь поставит нечаянно пробел, он будет удален и приложение не будет падать от пробела.


#5
    if dateTF.text == "" || monthTF.text == "" || yearTF.text == "" {
        let alertController = UIAlertController(title: "Не заполнены поля", message: "Заполните все поля", preferredStyle: .alert)
        let okAction = UIAlertAction(title: NSLocalizedString("Ok", comment: "Ok"), style: .default, handler: nil)
        alertController.addAction(okAction)
        present(alertController, animated: true, completion: nil)
        
    } else { }

Хотя выше ответили уже


#6

Огромное спасибо
Последний вопрос - как запретить вставку скопированного откуда либо текста в textfield


#7

Думаю это поможет


#8

@IBDesignable
class CustomTextField: UITextField {

@IBInspectable var isPasteEnabled: Bool = true

@IBInspectable var isSelectEnabled: Bool = true

@IBInspectable var isSelectAllEnabled: Bool = true

@IBInspectable var isCopyEnabled: Bool = true

@IBInspectable var isCutEnabled: Bool = true

@IBInspectable var isDeleteEnabled: Bool = true

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    switch action {
    case #selector(UIResponderStandardEditActions.paste(_:)) where !isPasteEnabled,
         #selector(UIResponderStandardEditActions.select(_:)) where !isSelectEnabled,
         #selector(UIResponderStandardEditActions.selectAll(_:)) where !isSelectAllEnabled,
         #selector(UIResponderStandardEditActions.copy(_:)) where !isCopyEnabled,
         #selector(UIResponderStandardEditActions.cut(_:)) where !isCutEnabled,
         #selector(UIResponderStandardEditActions.delete(_:)) where !isDeleteEnabled:
        return false
    default:
        //return true : this is not correct
        return super.canPerformAction(action, withSender: sender)
    }
}

}