当在表视图控制器之间传递对象时,基于核心数据的应用程序在运行时发送的选择器错误,我面临着一个未捕获的异常。

我面临的问题(当您阅读此问题时会更加清楚)是我不确定如何引用核心数据对象的关系而不是调用对象本身。

让我们退后一步来看一下模型,该应用程序的前提很简单;允许用户创建具有名称,金额,时机和日期的“交易”。

具有wasGiven属性的交易实体
具有名称属性的人实体
具有标题属性的场合实体
具有金额属性的项目实体
事务与个人实体(whoBy)有关系,与场合实体(occasion)有联系,并有项目实体(itemType)有联系。

编辑:核心数据模型

 

该应用程序是一个简单的2标签表视图控制器-第一个标签包含所有信息,按日期划分。对于此TableViewController,我正在研究具有以下fetchedResultsController代码的“交易实体”:

- (NSFetchedResultsController *)fetchedResultsController
{
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

    if (_fetchedResultsController != nil)
    {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    fetchRequest.entity = entity;
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"occasion.dateOfEvent" ascending:NO];
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
    fetchRequest.fetchBatchSize = 20;
    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"occasion.dateOfEvent" cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}


第二个选项卡仅包含“名称”信息。有一个加号按钮,当用户按下时,会显示一个模态视图,以添加名称,场合,金额和日期。他们按保存,然后将其保存到核心数据数据库。因此,第二个选项卡仅显示名称(我必须做很多工作才能使该位正常工作,因此它不会重复),但是第二个表视图的fetchedResultsController是:

- (NSFetchedResultsController *)fetchedResultsController
{
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

    if (_fetchedResultsController != nil)
    {
        return _fetchedResultsController;
    }
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext];
    fetchRequest.entity = entity;
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;        _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}


当我选择一行时,prepareForSegue方法被调用:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    NSIndexPath *indexPath = [self.personTableView indexPathForCell:sender];
    Transaction *selectedTransaction = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if ([segue.identifier isEqualToString:@"Selected Person Segue"])
    {
        EnvylopeSelectedPersonTableViewController *selectedPerson = [segue destinationViewController];

        [selectedPerson setTransaction:selectedTransaction];
    }
}


因此,在SelectedTableView中,我显然有一个属性可以保存该属性:

@property (nonatomic, strong) Transaction *transaction;


通过设置器将其标题设置为所选名称。

我想要在这个新的Table视图中显示的只是那个人的历史-与原始的第一个选项卡非常相似,但是只是针对这个人而定制的,这就是为什么我认为我要使用谓词。

选定的表视图fetchedResultsController为:

- (NSFetchedResultsController *)fetchedResultsController
{
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

    if (_fetchedResultsController != nil)
    {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
    fetchRequest.entity = entity;


    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"occasion.dateOfEvent" ascending:NO];

    fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];
    fetchRequest.fetchBatchSize = 20;

    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"whoBy.name = %@", self.transaction.whoBy.name];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"occasion.dateOfEvent" cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}


这正在创建一个例外:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Person whoBy]: unrecognized selector sent to instance 0x8b550b0'


我了解为什么会这样;我正在传递事务并显示事务,但是我无法在人员表视图中使用事务,因为它会为人员创建重复项(这是我在此处面临的大问题),那么我怎么能以某种方式行事呢?我需要在“选定表”视图中使用Transaction fetchRequest的原因是,我需要引用日期,标题和金额,所有这些都与事务相关,而不是Person的一部分。

任何帮助,将不胜感激!

最佳答案

prepareForSegue:中,获取的结果控制器获取Person对象,而不是
交易对象。因此

Transaction *selectedTransaction = [self.fetchedResultsController objectAtIndexPath:indexPath];


实际上是一个Person(将其广播到Transaction不会改变这一事实)。
所以你应该把它改成

Person *selectedPerson = [self.fetchedResultsController objectAtIndexPath:indexPath];
EnvylopeSelectedPersonTableViewController *selectedPersonVC = [segue destinationViewController];
selectedPersonVC.person = selectedPerson;


其中,person是EnvylopeSelectedPersonTableViewController的属性:

@property (nonatomic, strong) Person *person;


显示此人的所有交易的谓词就是

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"whoBy = %@", self.person];

关于ios - 将核心数据对象传递给新的Table View Controller,但使用对象的关系在新的View Controller中显示该数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20080889/

10-09 16:14
查看更多