【问题标题】:Store UITableViewCell information into core data without segue xcode 5将 UITableViewCell 信息存储到核心数据中,无需 segue xcode 5
【发布时间】:2014-07-25 12:28:42
【问题描述】:

我有一个 TableViewController 和一个可以扩展的 UITableViewCell。当它展开时,我想保存使用 UIBarButtonItem 设置的数据,因此此按钮将调用保存方法。我试图将它保存在我的 ViewController 实现文件中,但我总是收到一条错误消息:

'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'

我将所有基本代码从另一个项目复制到我的 AppDelegate 实现文件中,该项目只是一个使用核心数据的基本项目。我也制作了我的 xcdatamodeld 文件,其中包含一个警报实体和七个属性。我还为实体创建了一个 NSManagedObject 类。此外,我还有一个 AlarmCell,我在其中设置了 UITableViewCell 属性。

我的 ViewController.m 代码是:

- (IBAction)optionSet:(UIBarButtonItem *)sender
{
  if ([_alarmOperation.title isEqual:@"Save"])
  {
      [self saveTheAlarmFinally];
  }
}

BOOL monSet, tueSet, wedSet, thuSet, friSet, satSet, sunSet;

- (void) saveTheAlarmFinally
{
AlarmCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AlarmCell"];

if (cell.mon.tintColor == RGB(0, 204, 102))
{
    monSet = YES;
}
else
{
    monSet = NO;
}
if (cell.tue.tintColor == RGB(0, 204, 102))
{
    tueSet = YES;
}
else
{
    tueSet = NO;
}
if (cell.wed.tintColor == RGB(0, 204, 102))
{
    wedSet = YES;
}
else
{
    wedSet = NO;
}
if (cell.thu.tintColor == RGB(0, 204, 102))
{
    thuSet = YES;
}
else
{
    thuSet = NO;
}
if (cell.fri.tintColor == RGB(0, 204, 102))
{
    friSet = YES;
}
else
{
    friSet = NO;
}
if (cell.sat.tintColor == RGB(0, 204, 102))
{
    satSet = YES;
}
else
{
    satSet = NO;
}
if (cell.sun.tintColor == RGB(0, 204, 102))
{
    sunSet = YES;
}
else
{
    sunSet = NO;
}    

[self createNewAlarmWithMonday:monSet Tuesday:tueSet Wednesday:wedSet Thursday:thuSet Friday:friSet Saturday:satSet Sunday:sunSet];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Alarm"];

NSError *requestError = nil;

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];

NSArray *alarms = [[appDelegate managedObjectContext] executeFetchRequest:fetchRequest error:&requestError];

}

- (BOOL) createNewAlarmWithMonday:(BOOL)paramMonday
                       Tuesday:(BOOL)paramTuesday
                       Wednesday:(BOOL)paramWednesday
                       Thursday:(BOOL)paramThursday
                       Friday:(BOOL)paramFriday
                       Saturday:(BOOL)paramSaturday
                       Sunday:(BOOL)paramSunday                   
{
BOOL result = NO;

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];


Alarm *newAlarm = [NSEntityDescription insertNewObjectForEntityForName:@"Alarm" inManagedObjectContext:[appDelegate managedObjectContext]];

if (newAlarm == nil)
{
    NSLog(@"Failed to create the new alarm.");
    return NO;
}

newAlarm.monday = [NSNumber numberWithBool:paramMonday];
newAlarm.tuesday = [NSNumber numberWithBool:paramTuesday];
newAlarm.wednesday = [NSNumber numberWithBool:paramWednesday];
newAlarm.thursday = [NSNumber numberWithBool:paramThursday];
newAlarm.friday = [NSNumber numberWithBool:paramFriday];
newAlarm.saturday = [NSNumber numberWithBool:paramSaturday];
newAlarm.sunday = [NSNumber numberWithBool:paramSunday];

NSError *savingError = nil;

if ([self.managedObjectContext save:&savingError])
{
    return YES;
}
else
{
    NSLog(@"Failed to save the new alarm. Error = %@", savingError);
}

return result;
}

【问题讨论】:

    标签: ios objective-c xcode uitableview core-data


    【解决方案1】:

    你的想法是错误的。您不应该在保存方法上调用 dequeueReusableCellWithIdentifier: - 只有在表格视图想要显示单元格时才应该调用它。此外,单元格不应该存储任何数据,它们应该只通知您的控制器有关更改,并且控制器应该知道如何处理单元格操作。或者,单元格应该具有与之关联的模型(警报)并直接对其进行修改。通过比较颜色来检查单元格状态也是错误的(颜色可能会改变,您的代码将停止工作)。

    关于NSPersistentStoreCoordinator 的错误,我看到您使用[appDelegate managedObjectContext] 插入对象,然后使用self.managedObjectContext 保存它-也许,第二个未正确初始化-未设置持久存储?

    【讨论】:

    • 所以我应该根据 UITableviewCells 行为将数据保存在 ViewController 中吗?所以我也应该在 AlarmCell 中实现 Alarm.h 吗?对不起,我是初学者。我设置了 appDelegate managedObjectContext 以便从 AppDelegate 获取对象上下文。我应该这样做,还是我也可以在 ViewController 文件中定义 managedObjectContext ?我还没有设置任何持久性存储,我想没有它我可以解决。我应该设置一个持久存储以便工作吗?
    • 我认为,你应该从bignerdranch.com/we-write/ios-programming.html 这样的好书开始编程。另外,请阅读 Apple 文档 - NSManagedContextObject 无法在没有持久存储的情况下保存数据。因此,当创建新的NSManagedObjectContext 时,只需从 appDelegate 设置相同的持久存储。此外,阅读 Apple 网站(Recipes.app 是一个好的开始)和其他网站(如 raywenderlich.com)上的教程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多