首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用核心数据中的日期属性在表视图控制器中创建区段标题

使用核心数据中的日期属性在表视图控制器中创建区段标题
EN

Stack Overflow用户
提问于 2013-10-17 15:01:10
回答 2查看 878关注 0票数 1

目前我有一个很好用的应用程序,目前我正在学习增强这一点的过程。我有一个TableViewController,当出现提示时,它会要求用户输入一些信息,当用户单击保存时,这些信息会相应地显示在表视图中。

我想请用户再添加一位信息,这将构成该部分。这将是日期。想想Instragram;在每张图片之前,你有一个日期,等等。我想实现这样的东西,输入的日期组成部分标题,然后按时间顺序显示它们。

我还在学习中,所以我真的被困在如何实现这一点上。我已经有一个数组(称为transactions),它负责当前在表视图中显示所有内容。

是否需要创建另一个数组来保存输入的日期?

我该如何实现这些方法:

代码语言:javascript
复制
sectionIndexTitlesForTableView

tableView:titleForHeaderInSection

我以前没有做过任何部分的实现,这让我很困惑。

事务实体与其他几个实体有关系,时机就是其中之一。在TableCell中,我成功地显示了transaction.occasion的结果,它调用了场合实体并显示了它的名称,等等。该场合实体也有一个dateOfEvent属性,基本上,我希望部分标题显示dateOfEvents,以及表示该日期事件的相应行。

任何帮助都将不胜感激!

附注:我现在不使用NSFetchedResultsController;我知道它更简单,但我想先用这种方式学习。

EN

回答 2

Stack Overflow用户

发布于 2016-03-23 03:26:22

我知道现在回答已经太晚了。我还是想在这里发表我的观点。

当我们使用核心数据来存储数据,并使用表视图来表示数据时,使用NSFetchedResultsController总是非常有用且节省时间。

这是一个类似whatsapp的简单场景,它将按天对所有消息进行分组,并对每个组中的消息进行排序:

数据模型:

代码语言:javascript
复制
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初始化为:

代码语言:javascript
复制
    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)")
    }

表视图的数据源为:

代码语言:javascript
复制
//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()日期扩展方法的示例实现:

代码语言:javascript
复制
func getTimeStrWithDayPrecision() -> String {
    let formatter = NSDateFormatter()
    formatter.timeStyle = .NoStyle
    formatter.dateStyle = .ShortStyle
    formatter.doesRelativeDateFormatting = true
    return formatter.stringFromDate(self)
}
票数 3
EN

Stack Overflow用户

发布于 2013-10-17 18:38:50

我不关心你是否使用核心数据或任何其他数据source.My结论是,你需要根据date.For对场合进行分组,你必须根据dateOfOccasion属性从你的数据源(这里是numberOfOccasions)中过滤场合。

我在这里发布了一些示例代码来对这些场合进行分组。在头文件中声明一个字典对象,比如dicOccasions。

代码语言:javascript
复制
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的计数使用以下代码。

代码语言:javascript
复制
-(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

代码语言:javascript
复制
NSString *dateOfOccasion = [self getSalesOrderKey:section];

您可以将其显示在标签中,并显示为横断面标题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19420231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档