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

时间:2011-06-23 23:17:20

标签: iphone ooad

我有一个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),我猜我可以在字典中保存表的索引,并在加载该表时检索它。或者其他类似的东西,不太确定。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

关于#2,您可以在UITableView上使用indexPathsOfVisibleRows来获取可见索引数组,将第一个存储在UserDefaults中,然后加载(或者如果发生则从下一个视图控制器弹出)call -scrollToRowAtIndexPath:atScrollPosition:动画:

一旦您的代码正常运行,我建议您观看iTunes U上有关分析和乐器的各种视频。这是一个经常被忽视的奇妙工具,真正有助于将精力集中在需要的地方。