繁体   English   中英

按属性对对象数组进行排序

[英]sorting array of objects by property

我是ios开发的新手,我正在尝试对由数组填充的表格视图进行排序。 我已经研究了其他解决方案,由于某种原因,tableview无法正确填充。 数组以升序排序,但是tableview不能以正确的顺序显示对象。

这是我要进行排序的内容:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"_miles"
                                             ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [_addObjects sortedArrayUsingDescriptors:sortDescriptors];
_objects = [NSMutableArray arrayWithArray:sortedArray];

这是我的cellforrow:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //NSLog(@"%@", _objects);

    VenuesTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    CustomObject *currentObject = [_objects objectAtIndex:indexPath.row];

    cell.venuesTitle.text = [currentObject nameOfVenue];
    NSString *preDistance = @"about";
    NSString *postDistance = @"miles";


    cell.venuesSubTitle.text = [NSString stringWithFormat:@"%@ %@ %@", preDistance,[_miles objectAtIndex:indexPath.row] ,postDistance];

    if (cell != nil) {
        NSMutableString *imagePath = [NSMutableString stringWithFormat:@"%@", [_paths objectAtIndex:indexPath.row]];
        [cell.venuesImage setContentMode:UIViewContentModeScaleAspectFit];
        [cell.venuesImage setImageWithURL:[NSURL URLWithString:imagePath] placeholderImage:[UIImage imageNamed:@"placeholder@2x.png"]];

    }
    return cell;
}

当我注销_objects数组时,会以正确的顺序获取它们,但是它们在表视图中的显示顺序不是正确的(对象具有我要尝试排序的Miles属性)。

您正在按miles对数组_addObjects进行排序并将结果存储在_objects ,但是,当您显示结果时,您不会从刚刚创建的排序数组中访问miles ,而是在其他数组中查找。

我不知道何时填充该单独的_miles数组,但我建议您完全_miles它,并确保从CustomObject实例获取并设置miles属性。 (同为_paths ...这也许应该是你的财产CustomObject ,而不是一个单独的数组。)

我看不到任何明显的东西,但是有些奇怪的地方:

您不应使用_objects 始终改用self.objects 大多数编程语言都完全有可能使完全不可能像您在此处那样直接访问指针。 这很危险,并且可能导致令人迷惑的错误。 您应该几乎永远不要使用_foobar访问属性。 始终使用self.foobar

为什么要使用NSMutableArray而不是NSArray 您确定其他地方没有代码对其进行修改吗?

VenuesTableViewCell *cell在哪里创建? 我看不到您的代码中的任何地方创建这些对象之一。 [tableView dequeueReusableCellWithIdentifier..]永远不会创建新的单元格,它总是返回一个现有的单元格;如果不存在,则始终返回nil 您的代码没有引发断言错误(我假设吗?),因此显然它永远不会返回nil 但是,如果在您第一次调用它时未返回nil ,那会发生一些奇怪的事情吗?

暂无
暂无

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

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