具有文本字段和核心数据的自定义单元格

时间:2013-04-06 20:30:44

标签: core-data uitableview nsfetchedresultscontroller

我有一个tableview,我创建了一个带有两个文本字段的自定义单元格...我希望textfields中的文本保存在核心数据中,所以我为此创建了核心数据类,我知道如何实现核心数据方法。

我无法理解如何在tableview中显示单元格,以便用户输入文本然后将其保存在核心数据中。根据我的理解,这些是步骤:

1 - tableview加载并默认显示自定义单元格和文本字段。

2 - 用户输入文本,点击进入,然后将其保存在核心数据中。

我的问题是如何执行数字1,我​​无法在视图中加载数据,因为没有数据YET!我必须首先显示单元格。

任何人都可以帮我解决这个问题,让我明白我在这里缺少什么?到目前为止,这是我的代码:

- (void)viewDidLoad
{

AppDelegate *appDelegate =[[UIApplication sharedApplication] delegate];
self.managedObjectContext=[appDelegate managedObjectContext];


NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

}

[self fetchedResultsController];


[super viewDidLoad];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

return [[self.fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{
static NSString *CellIdentifier = @"machines";

cellMeios *cellM = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cellM == nil) {
    cellM = [[cellMeios alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

return cellM;
}

- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil)
{
    return _fetchedResultsController;
}

// Create and configure a fetch request.
NSFetchRequest *fetchRequestMo = [[NSFetchRequest alloc] init];
NSEntityDescription *entityMo = [NSEntityDescription entityForName:@"Mo" inManagedObjectContext:self.managedObjectContext];
[fetchRequestMo setEntity:entityMo];

// Create the sort descriptors array.
NSSortDescriptor *cellTitle = [[NSSortDescriptor alloc] initWithKey:@"reference" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:cellTitle, nil];
[fetchRequestMo setSortDescriptors:sortDescriptors];

// Create and initialize the fetch results controller.
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequestMo managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"reference" cacheName:nil];
_fetchedResultsController.delegate = self;
self.fetchedResultsController = _fetchedResultsController;

return _fetchedResultsController;
}

还有其他方法,但我认为它们与我的问题无关,事情是......我需要向用户展示一些东西,以便他可以填满!

我已经有另一个使用核心数据的tableview,但是在这种情况下,表首先是空的,然后在tableview顶部有一个加号按钮然后他选择了一些东西然后保存了在显示具有相关信息的单元格的核心数据中。

提前致谢  问候。

1 个答案:

答案 0 :(得分:2)

如果您希望表视图可编辑,则应该有一个类似于insertNewObject的方法,当用户点击导航栏中的“+”(加号)按钮时,该方法将被触发。此方法的实现创建一个新的托管对象,将其插入上下文中,然后重新加载该表。当fetchedResultsController返回空时,您也可以触发此方法。

这是我的一个视图控制器的版本:

- (void)insertNewObject:(id)sender
{
    NSManagedObjectContext *context = [self.managedObject managedObjectContext];
    NSRelationshipDescription *relation = [[self.managedObject entity] relationshipsByName][self.relationship];
    NSEntityDescription *destinationEntity = [relation destinationEntity];
    NSManagedObject *newManagedObject = (NSManagedObject*)[NSEntityDescription insertNewObjectForEntityForName:[destinationEntity name] inManagedObjectContext:context];

    if ([relation isOrdered]) {
        [self.items insertObject:newManagedObject atIndex:[self.items count]];
    }
    else {
        NSMutableSet *set = [self.managedObject mutableSetValueForKey:self.relationship];
        [set addObject:newManagedObject];
        self.items = [NSMutableOrderedSet orderedSetWithSet:set];
    }

    // Save the context.
    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Validation Error", @"Validation Error") message:[error localizedDescription] delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"OK") otherButtonTitles: nil, nil] show];
    }
    [self.tableView reloadData];
}