如何使用CoreData控制用户输入

时间:2013-07-16 13:05:19

标签: ios core-data uitableview

我真的不是iOS的专家,但我一直在开发应用程序来学习。在应用程序中,我有一个tableView,其中有两行用于输入核心数据:NSDate属性和NSString属性(数值)。

应用中的用户每天都会输入这些值。我想要实现的是在存储值之前进行某种输入检查:

1 - 首先,我想确保用户一天输入的NSString属性(主要是数字)从不比前一天并且永远不能在同一天输入两个值。

2 - 然后,我希望NSDate属性始终从当前日期开始永远不允许用户选择过去的日期。

如果我的问题很简单,我真诚地道歉,我真的需要一些帮助。

UPDATE:问题编号nsdate输入约束已解决。现在仍然存在以下问题:

  • 我想允许用户在tableview中的各自单元格中输入值。然后,当他点击保存按钮(**已实施)时,会显示**警告或简单文字信息,要求他更改输入的值,因为他输入的值小于之前的值天。前一天由他选择的NSDate输入属性定义(参见屏幕截图链接:http://i.stack.imgur.com/gJnkP.png,其中单元格1表示属性数值,单元格2是NSdate属性。

1 个答案:

答案 0 :(得分:0)

将此段代码用于我希望NSDate属性始终以当前日期开头,并且绝不允许用户选择过去的日期。

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *currentDate = [NSDate date];
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setYear:0];
 NSDate *minDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[shiftDatePicker setMinimumDate:minDate];

使用您的UIDatePicker名称代替我的名字。

你的第一个问题的答案有点过分。但我希望你能理解它。

首先,您应该在UIViewController中获取Table的对象。从CoreData获取值并与输入的用户匹配。如果用户输入了更大的值,那么没问题。如果它小于或等于先前值显示错误。

将此用作第一个问题。

- (NSFetchRequest *)getBasicRequestForEntityName: (NSString *)entityName
{
    //Get Fetch request for particuler entity.
    NSManagedObjectContext * managedObjectContext = [[AppDelegate getAppdelegate] managedObjectContext];
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];

    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    return request;
}


-(NSMutableArray*)getAllRequestedShifts
{
    NSFetchRequest *request = [self getBasicRequestForEntityName:@"YOUR ENTITY NAME"];

    [request setReturnsObjectsAsFaults:NO];
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"previous value" ascending:NO];

    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];


    NSError *error = nil;
    NSArray *results = [[managedObjectContext executeFetchRequest:request error:&error]mutableCopy];
    NSMutableArray *arr=[NSMutableArray array];

    if (!error && [results count] > 0)
    {

        for (int k=0; k<[results count]; k++)
        {
            YourentityObject *requestShiftObj = [results objectAtIndex:k];
            [arr addObject:requestShiftObj];
        }

    }
    return arr;
}

- (void)viewDidLoad方法中使用此行

NSMutableArray*  arrayOfSentRequest=[self getAllRequestedShifts];

这将返回位于CoreData且顶部有maxvalue对象的所有对象的列表。

检索此对象并使用属性 previousvalue ,并根据算法与输入和生成结果的值进行比较。

使用此代码

NSDateFormatter* dateF = [[NSDateFormatter alloc] init];
    [dateF setDateFormat:@"YYYY-MM-dd"];
  NSString *currentDate=[dateF stringFromDate:[NSDate date]];
    NSDate  * currentDateObj=[dateF dateFromString:currentDate];
    NSDate  * shiftDateFieldObj=[dateF dateobjectfromDB];
NSTimeInterval timeDifferenceBetweenDates = [shiftDateFieldObj timeIntervalSinceDate:currentDateObj];
 if (timeDifferenceBetweenDates>0.0)
  {
      Enter the value to text field ;
  }
  else
  {
       show alert
  }

希望这有帮助。