【问题标题】:Default IBAction - UISegmentControl, Object-oriented design help默认 IBAction - UISegmentControl,面向对象的设计帮助
【发布时间】:2011-06-23 23:17:19
【问题描述】:

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

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

【问题讨论】:

    标签: iphone ooad


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 2011-03-13
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多