繁体   English   中英

当请求旧数据时,在顶部而不是底部使用fetchedResultsController委托显示tableview的旧消息

Display Old messages of tableview using fetchedResultsController delegate at Top instead of bottom When Request Old Data

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

目前,我有一个Tableview,它在加载时向Core-Data发送请求,并获取较新消息的前10条消息。

// Initialize Fetch Request
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Chat"];

    // Add Sort Descriptors
    fetchRequest.fetchLimit = 10;
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"room = %@", _roomid];
    [fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"date_message" ascending:NO]]]; // YES;

    // Initialize Fetched Results Controller
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];

    _fetchedResultsController.delegate = self;

    // Perform Fetch
    NSError *error = nil;
    [self.fetchedResultsController performFetch:&error];

    if (error) {
        NSLog(@"Unable to perform fetch.");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }

在我打电话给他们之后。 消息正确显示在下面。 但是,当我加载(按需获取较旧的消息)时,会使用以下内容。

- (void)fetchOldMessages {

    [self.fetchedResultsController.fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"date_message" ascending:NO]]];
    _fetchedResultsController.fetchRequest.fetchLimit +=10;


    NSError *error = nil;
    [self.fetchedResultsController performFetch:&error];

    if (error) {
        NSLog(@"Unable to perform fetch.");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }

    [self.tableView reloadData];

}

问题是旧消息现在显示在下面而不是新消息的上面。 新插入的消息也显示在tableView的顶部而不是底部。

这是我的IndexPath:

- (UITableViewCell*)tableView:(UITableView*)table cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
                Chat *messageInfo = [self.fetchedResultsController objectAtIndexPath:indexPath];

                NSString *CellIdentifier = @"fromMe";
                FromMeTableViewCell *cell = [table dequeueReusableCellWithIdentifier:CellIdentifier];

                cell.message_me.clipsToBounds = YES;
                cell.message_me.layer.cornerRadius = 15;
                cell.message_me.textContainerInset = UIEdgeInsetsMake(8.0, 8.0, 8.0, 8.0);
                cell.message_me.text = messageInfo.message;
                cell.message_date_me.text = [NSString stringWithFormat:@"%@", messageInfo.date_message];

                cell.avatar_message_me.clipsToBounds = YES;
                cell.avatar_message_me.layer.cornerRadius = cell.avatar_message_me.frame.size.width / 2;
                cell.avatar_message_me.image = user_images[@"me"];
                cell.message_me.backgroundColor = [UIColor colorWithRed:0.098 green:0.737 blue:0.611 alpha:1];
                cell.message_me.textColor = [UIColor whiteColor]; //[UIColor whiteColor];

                // Date Settings
                NSDate *today = [[NSDate alloc]init];
                NSDate *message_date = messageInfo.date_message;

                NSDateFormatter  *formatDate = [[NSDateFormatter alloc]init];
                [formatDate setDateFormat:@"yyyy-MM-dd"];

                NSString *today_string = [formatDate stringFromDate:today];
                NSString *message_date_string = [formatDate stringFromDate:message_date];

                // Make Date validation case is older display full date
                if([today_string isEqualToString:message_date_string]){

                    NSDateFormatter *timeformat = [[NSDateFormatter alloc] init];
                    [timeformat setDateFormat:@"hh:mm a"];

                    NSDate *message_date = messageInfo.date_message;
                    NSString *string_date = [timeformat stringFromDate:message_date];
                    cell.message_date_me.text = [NSString stringWithFormat:@"Today at %@",[NSString stringWithFormat:@"%@",string_date]];

                }
                else {
                    NSDateFormatter *timeformat = [[NSDateFormatter alloc] init];
                    [timeformat setDateFormat:@"EEEE d hh:mm a"];

                    NSDate *message_date = messageInfo.date_message;
                    NSString *string_date = [timeformat stringFromDate:message_date];
                    cell.message_date_me.text = [NSString stringWithFormat:@"%@",[NSString stringWithFormat:@"%@",string_date]];
                }

                return cell;


}

这是第一次加载时显示5条消息,但最后一条消息应该关闭,而不是如DATE所示

当我加载更多数据时,它以从新到旧的正确顺序显示消息,但问题是我想在下面显示较新的消息,在上面显示较旧的消息。

当我加载更多数据时,它以从新到旧的正确顺序显示消息,但问题是我想在下面显示较新的消息,在上面显示较旧的消息。

1 个回复

使您的提取请求控制器将ASCENDING排序为YES

[self.fetchedResultsController.fetchRequest setSortDescriptors:@ [[NSSortDescriptor sortDescriptorWithKey:@“ date_message”升序:是]]]];

1 如何在列表顶部显示最新信息,在底部显示旧信息

我只是想问问我应该使用什么,并能够做我想做的事情。 例如,从当前的firebase值中提取出来的值变成Json,我可以得到以下信息: 通过此代码: 这是可行的,但是我想做的是在数据库得到更新时。 像图片中一样的新输入将位于其底部的最后一个输入的顶部 例如: ...

2 在底部加载最新消息,并放置“加载旧消息”按钮以在TableView上加载旧消息

我需要按时间顺序(最后显示在底部)显示消息,但是需要显示最后20条,并且顶部应该有“加载旧”按钮以获取旧消息。 但是,对于从核心数据中获取数据,我们可以指定排序描述符,基于该描述符来获取旧数据或最新数据,问题在于它以指定的顺序进行了排序。 即,如果我获取最近的消息,则会将该消息放在顶 ...

3 使用 backstack 时需要在顶部的旧片段

主屏幕有片段 A。 单击会将片段 A 替换为片段 B。 按后退按钮将片段 B 替换为 A。 然而,在完整动画完成之前,片段 B 位于片段 A 的顶部。 我想要他们反过来。 明显的代码: 我想要达到的效果: 想象片段 A 是一扇门。 门打开(片段A退出动画)和片段B落在屏幕上(片段B ...

4 套接字io显示旧消息

在聊天中,我使用mysql存储旧消息。 当有人加入房间时,我成功获得了它们,但是我无法在Angular正面上显示它。 我尝试使用socket.on,它不起作用,我想那是因为它是消息数组。 我需要帮助 ! 这是我的后背(控制器): 如果您需要更多代码,请告诉我。 谢谢 ...

5 插入/删除顶部/底部单元格时更新旧/新顶部/底部单元格的backgroundView

这是NSFetchedResultsControllerDelegate文档中给出的模板代码: 使用此代码,默认分组样式表视图可以很好地使用背景视图更改动画更新其单元格:删除第一个单元格时,第二个单元格成为第一个单元格,其顶角从正方形变为圆形,以及类似的东西。 但是,对于具有自定义 ...

6 使用JPQL createQuery时返回旧数据

使用JPA / Eclipse TopLink。 我正在更新一个表(使用createNativeQuery),如下所示: 更新反映在DB(MySQL)中 用于检索(使用createQuery),如下所示: 但是,返回的ResultList始终是更新前的数据。 但是当 ...

7 使用django InlineModelAdmin时,是否有办法在顶部显示多余的表单,而不是在所有现有表单之后显示底部的多余表单?

我在django Admin界面中使用inlines( InlineModelAdmin )使编辑父模型的模型更加容易。 但是,默认情况下,模型的额外表格显示在底部。 问题是以前可能有很多记录,因此您必须滚动到底部才能添加新记录。 有没有办法更改此默认行为,使新的额外表单出现在顶部? ...

9 QML 使用中继器和委托,显示旧列表

我正在使用中继器和委托来显示一个列表,一切正常,但是当我清理模型时,GUI 没有清理它,仍然显示旧列表。 我将模型从 cpp 连接器传递给 qml。 我尝试过 update()、repaint() 但没有效果。 任何线索都会有所帮助。 cp代码: 质量管理语言 编辑: 我缩小到 QSt ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM