Как реализовать валидацию в iOS-приложении

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


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

    self.buttonSave.userInteractionEnabled = NO;

Сделаем проверку на то введено ли описание события.

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([textField isEqual:self.textField]) {
        if (textField.text.length != 0) {
            [textField resignFirstResponder]; // свернуть текстовое поле
            self.buttonSave.userInteractionEnabled = YES;
            return YES;
        } else {
            [self showAlertWithMessage:@"Для сохранения события введите значение в текстовое поле"];
        }
    }
    
    return NO;
}

- (void)showAlertWithMessage:(NSString *)message
{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Внимание!"
                                                                   message:message
                                                            preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK"
                                                 style:UIAlertActionStyleDefault
                                               handler:^(UIAlertAction * __nonnull action) {}];
    [alert addAction:ok];
    [self presentViewController:alert animated:YES completion:nil];
}


Сделаем проверку на ввод даты.

- (void)save {
    if (self.eventDate) {
        if ([self.eventDate compare:[NSDate date]] == NSOrderedSame) {
            [self showAlertWithMessage:@"Дата будущего события не может совпадать с текущей датой"];
        } else if ([self.eventDate compare:[NSDate date]] == NSOrderedAscending) {
            [self showAlertWithMessage:@"Дата будущего события не может быть ранее текущей даты"];
        } else {
            [self setNotification];
        }
    } else {
        [self showAlertWithMessage:@"Для сохранения события измените значение даты на более позднее"];
    }
}

- (void)setNotification
{
    NSString *eventInfo = self.textField.text;
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"HH:mm dd.MMMM.yyyy"];
    NSString *eventDate = [formatter stringFromDate:self.eventDate];
    NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:eventInfo, @"eventInfo", eventDate, @"eventDate", nil];
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.userInfo = dict;
    notification.timeZone = [NSTimeZone defaultTimeZone];
    notification.fireDate = self.eventDate;
    notification.alertBody = eventInfo;
    notification.applicationIconBadgeNumber = 1;
    notification.soundName = UILocalNotificationDefaultSoundName;
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
}


И последний штрих, добавим запуск валидации при тапе по фону приложения.

- (void)handleEndEditing
{
    if (self.textField.text.length != 0) {
        [self.view endEditing:YES];
        self.buttonSave.userInteractionEnabled = YES;
    } else {
        [self showAlertWithMessage:@"Для сохранения события введите значение в текстовое поле"];
    }
}



Возможно вас ещё заинтересует пост Валидация данных в Core Data.