iPhone表格,你把你的validation?
简单的问题,我目前正在使用核心数据。 我有一个表格负责插入一个新的项目。 如果没有类别或名称,保存button应保持禁用。 目前,我在我的控制器中做了这个简单的if语句,但是在iOS开发中有没有关于validation的良好实践?
就像在rails或任何PHP MVC框架中一样,任何validation都应该在模型中,对于Core数据模型来说应该是一样的吗?
谢谢。
编辑
我现在做的是我检查与textFieldEditingChanged:如果我的文本字段都不是空的启用保存button。 当它们不是空的,用户按下保存,我创build我的新的核心数据对象,然后保存它。 根据你的解决scheme,你会build议什么?
当一个字段被修改的方法
- (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; } }
validation方法
- (BOOL)validatesRequiredFields { if (category != nil && personField.text.length != 0) { return YES; } else { return NO; } }
按下保存button的方法
- (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; }
区分validation由表单生成的托pipe对象和validationinput表单的数据是非常重要的。 核心数据将自动validation您添加到上下文的被pipe理对象。 但是,您的问题似乎与validationinput到表单中的数据有关,甚至可能在被pipe理对象被创build之前。
正如您所描述的那样,“保存”button的状态取决于您的某个字段中是否存在名称。 显然,视图控制器需要在某种程度上涉及到,因为模型对象不了解视图。 处理这个问题的一种方法就是让视图控制器自己进行validation,就像现在所做的一样。 这对于简单的情况并不是那么糟糕,如果你已经实现了你的视图控制器,那么在用户点击“保存”button之前不会创build被pipe理的对象。
另一种方法是让视图控制器在其视图第一次显示时创build一个新的托pipe对象,然后将所有更改复制到用户界面,然后复制到托pipe对象。 如果你这样做,你可以使用NSManagedObject的-validateForInsert:
和/或-validateForUpdate:
方法来判断被pipe理对象中的数据是否有效,并且可以根据结果设置“保存”button的状态。 这种方法意味着将会检查被pipe理对象的任何validation规则,并且改变实体的规则也不需要更新视图控制器中的validation码。
鼓励的做法是通过子类或扩展(通过类别)生成的托pipe对象,您可以添加其他function,包括数据validation。
我认为你的想法是正确的,它应该像Rails一样工作。
执行validation的最简单方法是直接将其插入到数据模型描述中。 然后,在运行时,可以使用validation方法来检查对象是否有效,从而启用/禁用button(例如validateForUpdate:)。
如果数据模型中的validation选项直接不适合您的需要,那么您可能需要inheritanceNSManagedObject并在此类中执行一些自定义validation。 “validation方法”段落在这里: https : //developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html
简而言之,就架构而言:
- 模型对象应该知道它们是否有效(通过核心数据模型描述或通过NSManagedObject的子类)
- 视图控制器应该询问模型是否有效,如果他们想给用户一些反馈
希望能帮助到你。
iOS开发应遵循MVC原则。