0

我有一个 UISegmentControl 和我的 UITableView 对数据进行排序。我希望能够做的事情:

(1) 默认排序(所以当用户第一次打开应用程序时,它会选择第一个段,并按该操作排序)

(2) 记住用户在表加载之间的位置。我的意思是,类似于 Apple 的封面流,当我转到不同的封面时,UITableView 会重新填充。因此,如果用户最后一次在那里,排序在第 3 段,那么它会记住这一点。

我对面向对象的设计有点陌生,这是我最好的猜测,不是到处都有相同的冗余代码:(MarkersList 是一个 NSMutableArray)

- (NSArray *)sortByName:(NSArray *)sortDescriptors {
    return [self.MarkersList sortedArrayUsingDescriptors:sortDescriptors];
}

- (NSArray *)sortByRSID:(NSArray *)sortDescriptors {
    return [self.MarkersList sortedArrayUsingDescriptors:sortDescriptors];
}

- (void)setSortedMarkersList:(NSArray *)sortedArray {
    if (self.MarkersList != nil) {
        [self.MarkersList removeAllObjects];
    }
    [self.MarkersList addObjectsFromArray:sortedArray];
}

- (IBAction)sortButtonPressed:(UISegmentedControl *)segmentControl {

    // Create sort descriptors
    NSSortDescriptor *nameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
    NSSortDescriptor *rsID = [[NSSortDescriptor alloc] initWithKey:@"ID" ascending:YES];

    if ([segmentControl selectedSegmentIndex] == NAME) { // this is #define 0 
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:nameDescriptor, rsIDDescriptor, nil];
        NSArray *sortedArray = [self sortByGene:sortDescriptors];
        [self setSortedMarkersList:sortedArray];
        [sortDescriptors release];

    }

    else if ([segmentControl selectedSegmentIndex] == RS_ID) {
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:rsIDDescriptor, resultDescriptor, nameDescriptor, nil];
        NSArray *sortedArray = [self sortByRSID:sortDescriptors];
        [sortDescriptors release];
        [self setSortedMarkersList:sortedArray];
    }

    [self.MarkersTableView reloadData];
}

我还没有实现第三种排序,因为它不仅仅是像其他两个那样的 NSString 或 NSNumber 。到目前为止,我认为它工作正常。但是,我遇到的问题是实现(1),我需要在加载表时调用 sortByName。我可以再次创建 NSSortDescriptors,但这似乎是多余的。有没有更OOD的方法来实现这一点?

对于(2),我猜我可以将表的索引保存在字典中,并在加载该表时检索它。或者类似的东西,不太确定。

任何帮助是极大的赞赏。谢谢!

4

1 回答 1

0

这不是一个面向对象的问题,因为 iOS 并不总是让我们使用最佳实践来解决问题。我认为,对于您的情况,最好的选择是将有关所选排序的信息存储在NSUserDefaults中。在您的 -viewDidLoad 方法中,检查所选排序对象是否存在于 NSUserDefaults 中,如果存在则使用它,如果不存在则选择合理的默认值。

不要担心每次加载应用程序时都会创建 NSSortDescriptor,除非您已经完成了分析并确定花费了大量时间来构建它。序列化和反序列化 NSSortDescriptors 比仅在需要时重新创建它效率低得多。Apple 花费大量时间优化 NSSortDescriptor 等常用类。

关于#2,您可以在 UITableView 上使用 indexPathsOfVisibleRows 来获取可见索引数组,将第一个索引存储在 UserDefaults 中,然后在加载(或从下一个视图控制器弹出,如果发生这种情况)调用 –scrollToRowAtIndexPath:atScrollPosition:animated:。

一旦你的代码正常运行,我建议你在 iTunes U 上观看关于分析和仪器的各种视频。这是一个经常被忽视的出色工具,并且确实有助于将精力集中在需要的地方。

于 2011-06-24T00:26:19.727 回答