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 有啥关系?