iPhone表格,您在哪里进行验证?

时间:2012-03-21 14:24:11

标签: iphone objective-c ios core-data

简单的问题,我目前正在使用Core Data。我有一个负责插入新项目的表单。如果没有类别或名称,则保留按钮应保持禁用状态。目前,我在我的控制器中执行这个简单的if语句,但在iOS开发中是否有任何关于验证的良好实践?

与rails或任何PHP MVC框架一样,任何验证都应该在模型中,核心数据模型是否相同?

谢谢。

修改

我目前正在做的是使用textFieldEditingChanged检查:如果我的两个文本字段都不为空,则启用保存按钮。当它们不为空并且用户按Save时,我创建新的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 个答案:

答案 0 :(得分:3)

区分验证将从表单生成的托管对象和验证输入到表单中的数据非常重要。 Core Data将自动验证您添加到上下文的托管对象。但是,您的问题似乎与验证输入到表单中的数据有关,可能在创建托管对象之前。

正如您所描述的那样,"保存"按钮取决于您的某个字段中是否存在名称。显然,视图控制器需要在某种程度上参与其中,因为模型对象对视图一无所知。处理此问题的一种方法是让视图控制器自己进行验证,就像您现在正在做的那样。对于简单的情况来说,这并不是那么糟糕,如果您已经实现了您的视图控制器,那么在用户点击&#34之前不会创建托管对象,这是显而易见的路线。 ;保存"按钮。

另一种方法是让视图控制器在首次显示视图时创建新的托管对象,然后将对用户界面的任何更改复制到托管对象。如果您这样做,您可以使用NSManagedObject的-validateForInsert:和/或-validateForUpdate:方法来确定托管对象中的数据是否有效,并且您可以设置&的状态#34;保存"基于结果的按钮。这种方法意味着将检查托管对象的任何验证规则,并且更改实体的规则也不需要更新视图控制器中的验证代码。

答案 1 :(得分:2)

鼓励的做法是对生成的托管对象进行子类化或扩展(通过类别),您可以在其中添加其他功能,包括数据验证。

答案 2 :(得分:2)

我认为你的假设是正确的,它应该像Rails一样工作。

执行验证的最简单方法是将其直接插入数据模型描述中。然后,在运行时,您可以使用验证方法来检查对象是否有效并因此启用/禁用按钮(例如,使用validateForUpdate)。

如果数据模型中的验证选项不能直接满足您的需求,那么您可能需要子类化NSManagedObject并在此类中执行一些自定义验证,参见“验证方法”段落在此处:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html

简而言之,就建筑而言:

  • 模型对象应该知道它们是否有效(通过核心数据模型描述或通过NSManagedObject的子类)
  • 视图控制器应询问模型是否有效,如果他们想要向用户提供一些反馈

希望它有所帮助。

答案 3 :(得分:-2)

iOS开发应遵循MVC原则。