UITableView 和 CoreData - 在特定行和效率中显示数据?

Posted

技术标签:

【中文标题】UITableView 和 CoreData - 在特定行和效率中显示数据?【英文标题】:UITableView and CoreData - Displaying Data in Specific Rows and Efficiency? 【发布时间】:2010-11-20 07:27:09 【问题描述】:

所以,我有一个核心数据对象,我们称它为会话(好吧,这就是它的实际名称),它有四个属性(名称、驾驶员、轨道和汽车),我想在其中显示表格视图。我以前用过它,但是,唉,我正试图让我的视图控制器更加通用和可重用,所以,我正在对其进行一些更改。任何人,这就是桌子的样子......

传入视图控制器的是一个 Session,它是 CoreData 为我准备的 NSManagedObject 的子类。 Driver、Car 和 Track 都是对象关系,而 name 只是一个字符串。 Driver、Car 和 Track 都有我在此表中显示的名称属性。我想要一种快速而肮脏的方式将此文本显示到表格中。所以,我正在做类似的事情......

NSDictionary *parameterValues = [[NSDictionary alloc] initWithObjectsAndKeys: sessionName, [NSNumber numberWithInt: 0], sessionDriver, [NSNumber numberWithInt: 1], sessionCar, [NSNumber numberWithInt: 2], sessionTrack, [NSNumber numberWithInt: 3], nil];

NSString *parameterString;
if([indexPath row] > 0) 
    if([parameterValues objectForKey: [NSNumber numberWithInt: [indexPath row]]] == [NSNull null])  
        parameterString = [[NSString alloc] initWithFormat: @"Select a %@", [parameterNames objectAtIndex: [indexPath row]]];
     else
        parameterString = [[parameterValues objectForKey: [NSNumber numberWithInt: [indexPath row]]] name];
    
 else
    parameterString = [parameterValues objectForKey: [NSNumber numberWithInt: 0]];
    if([parameterString isEqualToString: @""])  
        parameterString = @"Enter A Name";
    

这在我开始将会话作为实例变量传递之前有效,而不是跟踪特定的字符串、驱动程序、汽车和跟踪对象。由于 [[self session] driver], 将在传递新会话对象时返回 nil,因此不能使用字典对象。我现在就是这样做的……

//these come in handy, they're the object names (We can use KVC), and we can use them in the table titles
NSArray *parameterNames = [[NSArray alloc] initWithObjects: @"Name", @"Driver", @"Car", @"Track", nil];

//get the object for this row... (Name, Driver, Car, Track), and create a string to hold it's value..
id object = [session valueForKey: [parameterNames objectAtIndex: [indexPath row]]];
NSString *parameterValue;

NSLog(@"%@", [session name]);

//if this isn't the name row...
if(object != nil)   
    //if the indexPath is greater than 0, object is not name (NSString)
    if([indexPath row] > 0) 
        parameterValue = [object name];
     else
        parameterValue = object;
    
 else
    //object doesn't exist yet... placeholder!
    parameterValue = [@"Select a " stringByAppendingString: (NSString *)[parameterNames objectAtIndex: [indexPath row]]];

我要问的是……我这样做对吗?

谢谢, Matt - 核心数据新手:/

【问题讨论】:

【参考方案1】:

你想多了。如果您有这样的会话实体:

Session
    name:string
    driver<-->Driver
    car<-->Car
    track<-->Track

Driver、Car 和 Track 都具有 name 属性,那么您只需像这样询问属性值即可填充固定表:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell 
                                         forRowAtIndexPath:(NSIndexPath *)indexPath

    cell=//... get cell however you do it
    switch (indexPath.row) 
        case 0:
            cell.textLabel.text=self.currentSession.name
            break;
        case 1:
            cell.textLabel.text=self.currentSession.driver.name;
            break;
        //... and so on
        default:
            break;
    
    //... return the cell. 

同样,要让对象传递到详细视图,您只需使用相同的 switch 语句来获取与所选行关联的对象。

【讨论】:

我正在这样做,但出于某种原因,我正在寻找更优雅的解决方案。现在我看了一下,这可能是一种更有效的方法……--唯一的一点是,在每个 switch 语句中,我必须检查对象是否为 nil……这使得语句更多,杂乱无章。嗯,让我再看一遍.. -- 谢谢 :D 如果您担心零关系,最简单的解决方案是使关系成为必需,然后为实体提供默认值以在 UI 中显示。例如。会话具有必需的驱动程序关系,并且驱动程序实体的默认名称为“无”。这样,您无需任何检查即可获得所需的行为和 UI。 我就是这么想的,虽然我觉得我疯了。 - 谢谢:D

以上是关于UITableView 和 CoreData - 在特定行和效率中显示数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 coredata 在 UITableView 中添加 ABMultiValue Cell

UITableView 和 CoreData - 在特定行和效率中显示数据?

在 UITableView 中显示 CoreData 对象在 Set 中排序

在 coredata 中加载图像时 UITableView 滞后

使用 NSFetchedResultsController 时 CoreData 与 UITableView 有啥关系?

UITableView 充满 CoreData 结果加上额外的单元格?