默认IBAction-UISegmentControl,面向对象的设计帮助

问题描述

|| 我的UITableView有一个对数据进行排序的UISegmentControl。我希望能够做的事情: (1)默认排序(因此,当用户首次打开应用程序时,它将选择第一个细分,然后按照该操作进行排序) (2)记住用户在表加载之间的位置。我的意思是,类似于Apple的Coverflow,当我转到其他封面时,UITableView会重新填充。因此,如果用户最后一次在那儿,则排序在第三段,那么它会记住这一点。 我对面向对象的设计有点陌生,这是我最好的猜测,因为到处都没有相同的冗余代码:(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),我想我可以将该表的索引保存在字典中,并在加载该表时检索它。或类似的东西,不是很确定。 任何帮助是极大的赞赏。谢谢!     

解决方法

        这并不是面向对象问题,因为iOS并不总是让我们使用最佳实践来解决问题。我认为,最适合您的情况的选择是将有关所选排序的信息存储在NSUserDefaults中。在您的-viewDidLoad方法中,检查所选排序对象是否存在于NSUserDefaults中,如果存在,请使用它,否则请选择一个合理的默认值。 不必担心会为应用程序的每次加载创建NSSortDescriptor,除非您已进行了概要分析并确定花费了大量时间来构建它。 NSSortDescriptor的序列化和反序列化将比仅在需要时重新创建它效率低得多。苹果花费大量时间来优化诸如NSSortDescriptor之类的常用类。 关于#2,您可以在UITableView上使用indexPathsOfVisibleRows获取可见索引数组,将第一个索引存储在UserDefaults中,然后在加载时(或从下一个视图控制器弹出,如果发生的话)调用–scrollToRowAtIndexPath:atScrollPosition:animated:。 代码正常运行后,建议您在iTunes U上观看有关性能分析和乐器的各种视频。这是一个经常被忽视的出色工具,确实有助于将精力集中在需要的地方。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...