我有一个表视图,从我的数据库中提取数据,并将其显示在我的tableview单元格中。返回的值是:
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显示这些数组中的第一个(一个单元格),就像在聊天应用程序中看到对话列表时一样。
我目前已完成此代码,但它实际上只返回一个单元格和一个数组,由最近发布的数据填充。例如。 tableview返回单元格:
LEEYA
何时返回:
LEEYA
JESSICA
请参阅下面的代码。我认为这是因为行
NSString * nodeTitle = self.messages [0] [@" name"];
始终等于一个用户名,因此它返回一个值。
所以我的问题是:如何才能使该行功能正确,"如果' name'字典self.messages中的值出现不止一次,只显示第一个值" ? 或换句话说: 如果' 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];
}
我希望我能清楚地解释清楚。谢谢!
答案 0 :(得分:2)
我建议不要在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的新类型数组语法,它也会更清晰,但我不记得我的头。)