将不同的实体分配给不同的原型单元

时间:2014-08-02 20:17:23

标签: objective-c uitableview core-data entity fetch

我正在Xcode上制作一个coredata应用程序。我有几个实体都使用自己的原型单元样式在自己的表中填充单元格。我想在一个主表上查看所有实体,并发送每个实体来填充其匹配的单元格。

我认为最好的方法是创建一个抽象实体并使用if语句为每个实体声明cellidentifier。我错了,因为它还没有奏效。这就是我所拥有的:

在viewDidLoad中:

NSEntityDescription *entityDescription = [NSEntityDescription
                                          entityForName:@"MyAbstractEntity" inManagedObjectContext:_managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];

[request setEntity:entityDescription];

在数据模型中设置关系。这是试图识别子实体的表:

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

NSString *identifier;

if ([NSEntityDescription entityForName:@“Animals” inManagedObjectContext:_managedObjectContext])
{
    identifier = @“AnimalsCell";


    AnimalsCell *animalsView = (AnimalsCell *)[tableView dequeueReusableCellWithIdentifier:@"AnimalsCell" forIndexPath:indexPath];

    Animals *animals = (Animals *)[reportArray objectAtIndex:indexPath.row];
    animalsView.descriptionTextField.text = [animals description];
    return animalsView;
}

if ([NSEntityDescription entityForName:@“Plants” inManagedObjectContext:_managedObjectContext])
{
    identifier = @“PlantsCell";


    PlantsCell *animalsView = (PlantsCell *)[tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];



    Plants *plants = (Plants *)[reportArray objectAtIndex:indexPath.row];
    plantsView.flowerTextField.text = [plants flowerDetail];
    return plantsView;
}
return 0;
}

如果我输入动物,它会显示在概览表中。如果我进入工厂,它会崩溃,因为它试图将植物数据放入动物细胞,这意味着我的标识符if语句不能正常工作。这是我第一次尝试显示来自多个实体的数据而且我从未使用过抽象实体,所以我可能做错了。非常感谢,伙计们!

1 个答案:

答案 0 :(得分:0)

if ([NSEntityDescription entityForName:@"Animals" inManagedObjectContext:_managedObjectContext])

始终为true ,因为if语句中的条件返回实体描述 那不是nil。该代码不识别当前对象的实体 待显示。

您可以做的是比较实际对象的实体名称:

MyAbstractEntity *object = [reportArray objectAtIndex:indexPath.row];
NSString *entityName = object.entity.name;
if ([entityName isEqualToString:@"Animals"]) {
   Animals *animals = (Animals *)object;
   ...
} else if ([entityName isEqualToString:@"Plants"]) {
   Plants *plants = (Plants *)object;
   ...
} else {
   // What ???
}