繁体   English   中英

Obj-C-筛选tableview中返回的数据以获取字典中的第一个值?

[英]Obj-C - Filter returned data in tableview for first values in dictionary?

我有一个表格视图,该表格视图从数据库中提取数据,并将其显示在表格视图单元格中。 返回的值是:

 This is the messages data (
        {
        body = "13-10-2017 12:12";
        name = "Leeya";
    },
        {
        body = "09-10-2017 19:37";
        name = Leeya;
    },
        {
        body = "test";
        name = "Jessica";

    }

就是说,当我的字典返回包含相同“名称”值的多个数组(在本例中为“ Leeya”)时,我只希望我的表视图显示这些数组中的第一个(一个单元格),就像在聊天应用程序中,当您看到对话列表时。

我目前执行的代码可以完成此操作,但实际上它只返回由最新发布的数据填充的一个单元格和一个数组。 例如,tableview返回单元格:

LEEYA

何时返回:

LEEYA
JESSICA

请参阅下面的代码。 我认为这是因为

NSString * nodeTitle = self.messages [0] [@“ name”];

始终等于一个用户名,因此返回一个值。

所以我的问题是:如何使该行函数起作用,以便“如果字典self.messages中的'name'值出现多次,则仅显示第一个值”? 或者换句话说: 如果在随后的数组中“名称”值等于“名称”,则仅显示第一个?

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {

        NSString *nodeTitle = self.messages[0][@"name"];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", nodeTitle];
        NSArray *filteredArray = [self.messages filteredArrayUsingPredicate:predicate];
        id firstFoundObject = nil;
        firstFoundObject =  filteredArray.count > 0 ? filteredArray.firstObject : nil;
        NSDictionary *firstObjects = firstFoundObject;
        NSLog(@"The first objects are %@", firstObjects);
        static NSString *PointsTableIdentifier = @"MyMessagesCell";

        MyMessagesCell *cell = (MyMessagesCell *)[tableView dequeueReusableCellWithIdentifier:PointsTableIdentifier];
        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyMessagesCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];


        }

我希望我能清楚地解释这一点。 谢谢!

我建议不要尝试在cellForRowAtIndexPath中执行此操作。

相反,当您第一次从服务器获取数据时,编写一种方法,该方法采用输入数组并对其进行过滤以删除重复项。 像这样:

- (NSArray *) UniqueEntriesForArray: (NSArray *) sourceArray {
  NSMutableArray *results  = [NSMutableArray array];
  NSMutableSet *uniqueStrings = [NSMutableSet new];
  for (NSDictionary *element in sourceArray) {
    NSString *name = element[@"name"];
    if (![uniqueStrings contains: name]) {
       [uniqueStrings addObject: name];
       [results addObject: element];
    }
  }
  return [results copy];
}

(我的Objective-C有点生锈,因此可能需要进行一些调整。如果您为Objective-C使用新的类型化数组语法,也会更整洁,但我不记得这件事了。)

暂无
暂无

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

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