【问题标题】:How do I sort/order UICollectionView items using the price of the item?如何使用商品的价格对 UICollectionView 商品进行排序/排序?
【发布时间】:2014-04-29 15:38:28
【问题描述】:

试图想出一种动态排序 UICollectionView 项目的方法非常沮丧。

第一次加载 UICollectionView 时,会运行另一种执行查询的方法。此方法一次仅加载 4 个项目,并且始终与我的分页一起使用以加载 4 个。使用此方法设置排序更加令人困惑,因为我一次只能对 4 个项目进行排序。

所以我创建了另一种方法来在尝试对 UICollectionView 项目进行排序时执行查询。

我有一个 UIPickerView 允许客户对购物项目进行排序:

点击完成按钮后,将执行查询 parse.com:

- (void)pickerDoneButtonTapped
{
    NSLog(@"Picker done button pressed");
     [_thisController performQueryForFilter];
}

它返回一个排序对象的 NSArray,具体取决于选择器中的哪一行:

-(PFQuery *)queryForCollection
{
    PFQuery *query = [PFQuery queryWithClassName:@"Garments"];
        // check what the selectedRowInFilterPicker currently is
        // then add that task to the query    

        if (_selectedRowInFilterPicker == 0) {
            NSLog(@"ORDER BY RECOMMENDED");
        } else if (_selectedRowInFilterPicker == 1) {
            NSLog(@"ORDER BY NEWEST ITEMS");
        } else if (_selectedRowInFilterPicker == 2) {
            NSLog(@"ORDER BY DESCENDING USING PRICE");
            [query orderByDescending:@"price"];
        } else if (_selectedRowInFilterPicker == 3) {
            NSLog(@"ORDER BY ASCENDING USING PRICE");
            [query orderByAscending:@"price"];
        }
    return query;
}

这是在点击完成按钮时触发的 performQueryForFilter 方法:

- (void)performQueryForFilter
{
    NSLog(@"PERFORM QUERY FOR FILTER");
    PFQuery *query = self.queryForCollection;

    [self objectsWillLoad];

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {  
        self.isLoading = NO;
        if (error)
            self.objects = [NSArray new];
        else {
            if (_paginationEnabled && !_isRefreshing) {
                //add a new page of objects
                NSMutableArray *mutableObjects = [NSMutableArray arrayWithArray:self.objects];
                [mutableObjects addObjectsFromArray:objects];
                self.objects = [NSArray arrayWithArray:mutableObjects];
            }
            else {
                self.objects = objects;
            }
        }      
        [self objectsDidLoad:error];
    }];
}

这在一定程度上可以正常工作。我在 UIPickerView 中进行选择,然后完成。现在,在重新加载 UICollectionView 中的数据后,我遇到了 2 个问题。

  • 1. 正确排序的对象的整个 NSArray 现在是我的 dataSource 的数据,因此在重新加载数据后,所有这些对象都将添加到 UICollectionView。

  • 2. 首次加载 UICollectionView 时默认显示的先前单元格仍然保留。所以新排序的对象刚刚添加到下面。

现在我的数据库中最多有 9 行。现在假设将来有 1000 行。每次用户想要使用从低到高或从高到低的选项对项目进行排序时,我都无法加载 1000 行并将其添加到 UICollectionView。

请帮我看看哪里出了问题,或者至少展示一个更好的方法来做到这一点。

【问题讨论】:

  • 为什么我被标记了?我一直在寻找有关如何执行此操作的解决方案和信息。我总是在发布问题之前采取这些步骤。
  • 不知道你为什么被否决。不要认为这个 Q 应得的,所以我支持你。

标签: ios objective-c sorting uicollectionview parse-platform


【解决方案1】:

我认为这里存在误解,无论是您对收藏视图的理解,还是我的困难所在。

如果我理解正确,您担心如果您有一个包含 1000 个项目的数组,它们都会被加载到集合视图中。这是不正确的。集合视图中的单元格是按需动态加载的。每当要显示一个单元格时,都会要求数据源提供该单元格的信息。信息永远不会在任何时候一次全部加载。如果屏幕上最多可以显示 8 个单元格,则内存中最多加载 8 个单元格。就是这样。当用户滚动时,单元格被回收并用于显示下一个项目,依此类推。

所以有几件事。首先,您不需要优化分页数据。如果您需要在页面中加载数据,您应该为集合提供一些项目,然后在用户滚动时加载和卸载页面。如果信息不大,可以全部加载。 如果数据正常化,1000 行听起来并不像很多信息。其次,您的查询返回 1000 个项目 - 不要担心,集合视图只会加载它可以显示的必要单元格,仅此而已。它将为后面的数据重用之前的单元格。

【讨论】:

  • 我设法解决了这个问题,我想我做到了。还在测试。解决我帖子中的第二个问题。我从我的 collectionView 超类的 viewDidLoad 方法中删除了对 performQuery 的调用。所以现在第一次访问我的 collectionView 页面现在是空白的。我最终会让我的“推荐”项目显示为默认项目。为了在选择器中选择一行时解决其余问题,我清除了我的 dataSources NSArray。然后,当点击完成按钮时,将运行 performQuery 方法并获取结果并刷新 collectionView。到目前为止,这对我有用。
  • 这就是集合视图(和表视图顺便说一句)的设计方式 - 简单。请注意,并非所有数据都一次加载到集合视图中。
  • 这真的很简单。我需要做的就是操作我的 dataSources 对象 NSArray,然后我的集合视图委托和 dataSource 方法负责其余的工作。似乎试图以任何其他方式使事情复杂化。我一遍又一遍地经历同样的事情。希望这一次能在我脑海中浮现。
猜你喜欢
  • 2016-03-31
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多