iPhone формы, где вы положили подтверждение? - PullRequest
3 голосов
/ 21 марта 2012

Простой вопрос, в настоящее время я использую Core Data. У меня есть форма, которая отвечает за вставку нового элемента. Если категории или названия нет, кнопка сохранения должна оставаться отключенной. В настоящее время я делаю это простое утверждение if в моем контроллере, но есть ли полезная практика по валидации в iOS-разработке?

Как и в rails или любой среде PHP MVC, любые проверки должны быть в моделях. Будет ли это так же для моделей данных Core?

Спасибо.

EDIT

В настоящее время я проверяю с помощью textFieldEditingChanged: если оба моих текстовых поля не пусты, чтобы включить кнопку сохранения. Когда они не пусты и пользователь нажимает Сохранить, я создаю свой новый объект данных Core и затем сохраняю его. Что бы вы предложили в соответствии с вашим решением?

Когда поле модифицируется методом

- (IBAction)textFieldEditingChanged:(UITextField *)textField
{
    saveButton.enabled = [self validatesRequiredFields];

    if (textField == descField)
    {
        itemDesc = descField.text;
    }
    else if (textField == personField)
    {
        personName = personField.text;
    }
    else if (textField == valueField)
    {
        itemValue = valueField.text;
    }
}

Метод проверки

- (BOOL)validatesRequiredFields
{
    if (category != nil && personField.text.length != 0)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

При нажатии кнопки сохранения метод

- (IBAction)saveButtonPressed
{
    item = [Item createEntity];
    item.type = itemType;
    item.desc = itemDesc;
    item.value = itemValue;
    item.imageFilename = itemImageFilename;
    item.category = category;
    item.addedDate = itemDueDate;

    Person *p = [Person personWithName:personName];

    item.person = p;

    if (dueDateField)
    {
        item.dueDate = itemDueDate;
    }

    [delegate itemAddSaveButtonPressed:item];
}

РЕДАКТИРОВАТЬ 2

Что я сейчас использую

- (BOOL)isValid
{
    BOOL valid;
    NSError *error;

    item.type = itemType;
    item.desc = itemDesc;
    item.value = itemValue;
    item.imageFilename = itemImageFilename;
    item.category = category;
    item.addedDate = itemDueDate;

    if (dueDateField)
    {
        item.dueDate = itemDueDate;
    }

    if (personName.length > 0)
    {
        item.person = [Person personWithName:personName];   
    }
    else
    {
        item.person = nil;
    }

    if ([item validateForInsert:&error])
        valid = YES;
    else 
        valid = NO;

    return valid;
}

Ответы [ 4 ]

3 голосов
/ 21 марта 2012

Важно различать проверку управляемого объекта, который будет получен из формы, и проверку данных, введенных в форму.Базовые данные будут автоматически проверять управляемые объекты, которые вы добавляете в свой контекст.Однако ваш вопрос, похоже, относится к проверке данных, введенных в форму, возможно, еще до того, как управляемый объект будет создан.

Как вы уже описали, состояние кнопки «Сохранить» зависит от наличия имени в одном из ваших полей.Ясно, что контроллер представления должен быть вовлечен в некоторой степени, поскольку объекты модели ничего не знают о представлениях.Один из способов справиться с этим - просто позволить контроллеру представления выполнить свою собственную проверку, как вы делаете сейчас.Это не так уж плохо для простых случаев, и это очевидный путь, если вы реализовали свой контроллер представления таким образом, что управляемый объект не создается, пока пользователь не нажмет кнопку «Сохранить».

Другой способ сделатьон должен заставить контроллер представления создать новый управляемый объект при первом его отображении, а затем скопировать любые изменения пользовательского интерфейса в управляемый объект.Если вы делаете это таким образом, вы можете использовать методы NSManagedObject -validateForInsert: и / или -validateForUpdate:, чтобы решить, являются ли данные в управляемом объекте действительными, и вы можете установить состояние кнопки «сохранить» на основе результата.Этот подход означает, что будут проверяться любые правила проверки для управляемого объекта, и изменение правил для объекта не потребует также обновления кода проверки в контроллере представления.

2 голосов
/ 21 марта 2012

Рекомендуется создавать подклассы или расширять (через категории) сгенерированные управляемые объекты, где вы можете добавить дополнительные функции, включая проверку данных.

2 голосов
/ 21 марта 2012

Я думаю, вы правильно поняли, что должны работать как Rails.

Самый простой способ выполнить проверку - это вставить ее непосредственно в описание модели данных. Затем во время выполнения вы можете использовать методы проверки, чтобы проверить, является ли объект действительным, и, следовательно, включить / отключить кнопки (например, с помощью validateForUpdate:).

Если параметры проверки внутри модели данных напрямую не соответствуют вашим потребностям, вам, вероятно, потребуется создать подкласс NSManagedObject и выполнить некоторую настраиваемую проверку в этом классе, ср. Пункт «Методы проверки» здесь: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html

Короче говоря, с точки зрения архитектуры:

  • объекты модели должны знать, действительны они или нет (через описание модели Core Data или через подкласс NSManagedObject)
  • контроллеры представления должны спрашивать модели, действительны ли они или нет, если они хотят, следовательно, дать некоторую обратную связь пользователю

Надеюсь, это поможет.

0 голосов
/ 21 марта 2012

Разработка iOS должна следовать принципам MVC.

...