Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Obj-C-在tableview中为字典中的第一个值筛选返回的数据?_Ios_Objective C_Uitableview - Fatal编程技术网

Ios Obj-C-在tableview中为字典中的第一个值筛选返回的数据?

Ios Obj-C-在tableview中为字典中的第一个值筛选返回的数据?,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个表视图,它从数据库中提取数据,并将其显示在我的表视图单元格中。返回的值为: This is the messages data ( { body = "13-10-2017 12:12"; name = "Leeya"; }, { body = "09-10-2017 19:37"; name = Leeya; }, { body = "tes

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

 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";

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

我目前使用的代码实现了这一点,但实际上它只返回一个单元格和一个数组,由最近发布的数据填充。例如,tableview返回单元格:

LEEYA
应在何时返回:

LEEYA
JESSICA
请参阅下面的代码。我想这是因为

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

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

因此,我的问题是:如何使该行起作用,以便“如果dictionary self.messages中的'name'值出现多次,则只显示第一个值”或者换句话说:如果后面的数组中的“name”值等于“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];


        }

我希望我能解释清楚。谢谢

我建议不要在CellForRowatineXpath中尝试这样做

相反,当您第一次从服务器获取数据时,请编写一个方法来获取输入数组并对其进行过滤以删除重复项。大概是这样的:

- (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使用新的类型化数组语法,它也会更干净,但我记不得了。)

我建议不要在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使用新的类型化数组语法,它也会更干净,但我记不得了。)

类似于
NSMutableArray*results
NSMutableSet*uniqueStrings
我不确定在上面的代码中我将在哪里插入自己的值?例如,“我的代码”中的数据是self.messages,它是一个字典?基本上,您试图用一种方法过滤
消息
数组,只需返回一个填充了数据的单元格。因此,最好提前筛选数据,以便有一个更干净的
cellforrowatinexpath
方法。将此方法添加到视图控制器中,然后在检索数据后,执行如下操作:
NSArray*filteredMessages=[self-uniqueentriesforray:self.messages
并将此filteredMessages存储在另一个属性上。然后,在
cellForRowAtIndexPath
中,您只需执行以下操作:
NSDictionary*cellData=self.filteredMessages[indexPath.row]
并用这本字典填充你的单元格。McNight,谢谢你的编辑。我对Objective-C已经很生疏了,我真的需要编译和测试代码,否则我会出错的(类似于
NSMutableArray*results
NSMutableSet*uniqueStrings
我不确定在上面的代码中我将在哪里插入我自己的值?例如,我的代码中的数据是self.messages,它是一个字典?基本上,你试图用一种只需返回单元格pop的方法过滤你的
消息
数组使用数据筛选。因此,最好提前筛选数据,以便使用更干净的
cellforrowatinexpath
方法。将此方法添加到视图控制器中,然后在检索数据后,执行以下操作:
NSArray*filteredMessages=[self-uniqueentriesforray:self.messages
并将此filteredMessages存储在另一个属性上。然后,在
cellForRowAtIndexPath
中,您只需执行以下操作:
NSDictionary*cellData=self.filteredMessages[indexPath.row]
并用这本字典填充你的单元格。McNight,谢谢你的编辑。我对Objective-C已经很生疏了,我真的需要编译和测试代码,否则我会出错的(