我有一个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),我猜我可以在字典中保存表的索引,并在加载该表时检索它。或者其他类似的东西,不太确定。
非常感谢任何帮助。谢谢!
答案 0 :(得分:0)
这不是一个OO问题,因为iOS并不总是让我们使用最佳实践来解决问题。我认为,对于您的情况,最好的选择是将信息存储在NSUserDefaults中的所选排序中。在-viewDidLoad方法中,检查NSUserDefaults中是否存在所选排序对象,如果存在则使用它,如果不选择合理的默认值。
不要担心每次加载应用程序时都要创建NSSortDescriptors,除非您已经完成了分析并确定花费了大量时间来构建它。序列化和反序列化NSSortDescriptors比仅在需要时重新创建它时效率低得多。 Apple花费大量时间优化经常使用的类,如NSSortDescriptor。
关于#2,您可以在UITableView上使用indexPathsOfVisibleRows来获取可见索引数组,将第一个存储在UserDefaults中,然后加载(或者如果发生则从下一个视图控制器弹出)call -scrollToRowAtIndexPath:atScrollPosition:动画:
一旦您的代码正常运行,我建议您观看iTunes U上有关分析和乐器的各种视频。这是一个经常被忽视的奇妙工具,真正有助于将精力集中在需要的地方。