0

到目前为止,我有一个工作应用程序,它基本上包括以下内容:

使用核心数据,我有 1 个带有添加按钮的表视图控制器,它以模态方式调用一个新的视图控制器,提示用户将文本添加到三个字段中。还有一个选择字段,用户必须在“购买”和“出售”之间进行选择。当用户单击保存时,该条目将作为字幕单元格添加到表格视图控制器中,并填写了信息。它现在运行良好,没有买卖方面。

我想做的只是将表格视图单元格的颜色更改为绿色表示已售出,红色表示已买入。因此,当用户添加信息时,他们填写必填字段并选择买入或卖出,然后单击保存时,表格视图单元格显示每个条目的绿色或红色。

我在当前 TableViewController 中添加了 tableView 数据源和委托方法。有了这个,我基本上正在研究一个“交易”实体并获取与其他实体的关系。“状态”(已购买/已售)也在与交易实体相关的实体中,在它自己的称为购买的实体中。所以 Transaction 有一个称为 status.action 的关系(action 是 Transaction 的逆属性)。

这是到目前为止 TableView 的代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.transactions.count;
}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Persons";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSManagedObject *transaction = [self.transactions objectAtIndex:indexPath.row];        
    [cell.textLabel setText:[NSString stringWithFormat:@"%@ %@", [transaction valueForKeyPath:@"whoBy.name"], [transaction valueForKeyPath:@"gifting.amount"]]];
    [cell.detailTextLabel setText:[NSString stringWithFormat:@"%@", [transaction valueForKeyPath:@"occasion.title"]]];

    return cell;        
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        [self.managedObjectContext deleteObject:[self.transactions objectAtIndex:indexPath.row]];
        [self.transactions removeObjectAtIndex:indexPath.row];
        [self.tableView reloadData];

        NSError *error = nil;
        if (![self.managedObjectContext save:&error])
        {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
            [self.tableView reloadData];
        }
    }

}

来自 Modal 的代码实际上继续进行并允许用户添加条目文本(以及选择尚未实现的 Bought/Sold),如下所示:

NSManagedObjectContext *context = [self managedObjectContext];        
    NSManagedObject *transaction = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
    NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
    NSManagedObject *occasionEvent = [NSEntityDescription insertNewObjectForEntityForName:@"Occasion" inManagedObjectContext:context];
    NSManagedObject *amountType = [NSEntityDescription insertNewObjectForEntityForName:@"Gift" inManagedObjectContext:context];
    [person setValue:self.nameTextField.text forKey:@"name"];
    [occasionEvent setValue:self.occasionTextField.text forKey:@"title"];
    [amountType setValue:self.amountTextField.text forKey:@"amount"]; 
    [transaction setValue:person forKey:@"whoBy"];
    [transaction setValue:occasionEvent forKey:@"occasion"];
    [transaction setValue:amountType forKey:@"gifting"]; 

任何帮助,将不胜感激。

谢谢

4

1 回答 1

0

无需手动执行此操作,您需要做的就是从核心数据存储中读取单元格对象的状态并适当地设置背景颜色。

我还建议使用 NSFetchedResultsController 作为数据源。它旨在与 Core Data 和 tableviews 很好地配合使用,如果您正确设置了委托,它甚至会响应模型中的更改而无需您的任何干预。

编辑

根据您添加的评论,我可以看到问题所在。

Core Data 存储对象而不是值。因此,当您尝试将值放入核心数据存储时,您首先将它们转换为对象。当您从核心数据中获取对象时,您需要将其转换为您想要的值。

当您将对象添加到托管对象时,您可以在自己的操作中看到这一点:

 [transaction setValue:@(self.wasOptions.selectedSegmentIndex == 0) forKey:@"wasReceived"];

此表达式返回一个 BOOL

self.wasOptions.selectedSegmentIndex == 0

BOOl 是一个值,不能存储到 Core Data 中,因此您可以将其转换为 NSNumber 表示:

@(self.wasOptions.selectedSegmentIndex == 0)

因此,您现在有一个 NSNumber 对象,表示存储在核心数据中的 YES 或 NO 的 BOOL 值。

当您尝试获取密钥的值时:

 [transaction valueForKey:@"wasReceived"]

这是返回 NSNumber 表示而不是它表示的 BOOL 值

为了获得实际的 BOOL,请使用 NSNumber 中的便捷方法boolValue。因此,要解决您的问题,请替换此表达式:

 [transaction valueForKey:@"wasReceived"]

用这个表达式:

[[transaction valueForKey:@"wasReceived"] boolValue]

它返回一个适当的 BOOL 值,您的条件可以对其进行操作。

于 2013-10-14T09:46:43.613 回答