目前我有一个很好用的应用程序,目前我正在学习增强这一点的过程。我有一个TableViewController,当出现提示时,它会要求用户输入一些信息,当用户单击保存时,这些信息会相应地显示在表视图中。
我想请用户再添加一位信息,这将构成该部分。这将是日期。想想Instragram;在每张图片之前,你有一个日期,等等。我想实现这样的东西,输入的日期组成部分标题,然后按时间顺序显示它们。
我还在学习中,所以我真的被困在如何实现这一点上。我已经有一个数组(称为transactions),它负责当前在表视图中显示所有内容。
是否需要创建另一个数组来保存输入的日期?
我该如何实现这些方法:
sectionIndexTitlesForTableView
tableView:titleForHeaderInSection我以前没有做过任何部分的实现,这让我很困惑。
事务实体与其他几个实体有关系,时机就是其中之一。在TableCell中,我成功地显示了transaction.occasion的结果,它调用了场合实体并显示了它的名称,等等。该场合实体也有一个dateOfEvent属性,基本上,我希望部分标题显示dateOfEvents,以及表示该日期事件的相应行。
任何帮助都将不胜感激!
附注:我现在不使用NSFetchedResultsController;我知道它更简单,但我想先用这种方式学习。
发布于 2016-03-23 03:26:22
我知道现在回答已经太晚了。我还是想在这里发表我的观点。
当我们使用核心数据来存储数据,并使用表视图来表示数据时,使用NSFetchedResultsController总是非常有用且节省时间。
这是一个类似whatsapp的简单场景,它将按天对所有消息进行分组,并对每个组中的消息进行排序:
数据模型:
Message<<------->Conversation
Message{
@NSManaged var body: String?
@NSManaged var seen: NSNumber?
@NSManaged var time: NSDate?
@NSManaged var uid: String?
@NSManaged var conversation: Conversation?
var sectionTitle: String? {
//this is **transient** property
//to set it as transient, check mark the box with same name in data model
return time!.getTimeStrWithDayPrecision()
}
}将NSFetchedResultsController初始化为:
let request = NSFetchRequest(entityName: "Message")
let sortDiscriptor = NSSortDescriptor(key: "time", ascending: true)
request.sortDescriptors = [sortDiscriptor]
let pred = NSPredicate(format: "conversation.contact.uid == %@", _conversation!.contact!.uid!)
request.predicate = pred
let mainThreadMOC = DatabaseInterface.sharedInstance.mainThreadManagedObjectContext()
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: mainThreadMOC, sectionNameKeyPath: "sectionTitle", cacheName: nil)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch {
fatalError("Failed to initialize FetchedResultsController: \(error)")
}表视图的数据源为:
//MARK: Table view data source
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let sectionInfo = fetchedResultsController.sections![section]
let n = sectionInfo.numberOfObjects
return n
}
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 60
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let sectionInfo = fetchedResultsController!.sections! as [NSFetchedResultsSectionInfo]
return sectionInfo[section].name
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let message = fetchedResultsController.objectAtIndexPath(indexPath) as! Message
let cell = tableView.dequeueReusableCellWithIdentifier(IncomingChatBubbleCell.identifier(), forIndexPath: indexPath) as! IncomingChatBubbleCell
configureCell(cell, indexPath: indexPath)
return cell
}这将产生类似如下的结果:

希望这能对你有所帮助!
更新
这是getTimeStrWithDayPrecision()日期扩展方法的示例实现:
func getTimeStrWithDayPrecision() -> String {
let formatter = NSDateFormatter()
formatter.timeStyle = .NoStyle
formatter.dateStyle = .ShortStyle
formatter.doesRelativeDateFormatting = true
return formatter.stringFromDate(self)
}发布于 2013-10-17 18:38:50
我不关心你是否使用核心数据或任何其他数据source.My结论是,你需要根据date.For对场合进行分组,你必须根据dateOfOccasion属性从你的数据源(这里是numberOfOccasions)中过滤场合。
我在这里发布了一些示例代码来对这些场合进行分组。在头文件中声明一个字典对象,比如dicOccasions。
for(int i=0;i< numberOfOccasions;i++)
{
if(dicOccasions==nil)dicOccasions = [[NSMutableDictionary alloc] init];
NSString *key = [NSString stringWithFormat:@"%@",dateOfOccasion];
NSMutableArray *ArrTemp= (NSMutableArray*)[[dicOccasions objectForKey:key] mutableCopy];
if(ArrTemp==nil)ArrTemp = [[NSMutableArray alloc] init];
[ArrTemp addObject:[[numberOfOccasions objectAtIndex:i] copy]];
[dicOccasions setObject:[ArrTemp mutableCopy] forKey:key];
}在tableview numberOfsections委托中,您可以在tableView numberOfRowsInSection中使用dicOccasions的计数使用以下代码。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSString *key = [self getSalesOrderKey:section];
NSMutableArray * Arry = [dicOccasions objectForKey:key];
if([Arry isKindOfClass:[NSString class]])return 0;
return [Arry count];
}
-(NSString*)getSalesOrderKey:(int)section
{
NSArray *arr = [dicOccasions allKeys];
arr = [arr sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
if (section<arr.count)return [arr objectAtIndex:section];
return nil;
}在tableview的viewForHeaderInSecion委托中,您可以使用以下代码来获取dateOfOccasion
NSString *dateOfOccasion = [self getSalesOrderKey:section];您可以将其显示在标签中,并显示为横断面标题。
https://stackoverflow.com/questions/19420231
复制相似问题