【问题标题】:Sorting NSTableView排序 NSTableView
【发布时间】:2012-06-19 06:47:34
【问题描述】:

我在 NSTableView 中有两个列作为名称和工资,具有 5-10 个值。单击两个列的标题后,我想对这些列进行排序。互联网上有很多数据,但我无法使用这些数据。请帮我在可可中做到这一点。

在此先感谢您的帮助。

【问题讨论】:

  • 我在表中有两列,分别是姓名和工资,我将值硬编码而不绑定,现在我想对数据进行排序,我如何执行此任务。

标签: cocoa sorting nstableview


【解决方案1】:

每个表列都有一个方法setSortDescriptorPrototype 排序描述符是告诉数组如何对自身进行排序(升序、降序、忽略大小写等)的方式 遍历您想要排序的每一列,并在每一列上调用此方法,并传递所需的排序描述符(在我的情况下,我将使用列标识符)

for (NSTableColumn *tableColumn in tableView.tableColumns ) {

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:tableColumn.identifier ascending:YES selector:@selector(compare:)];
    [tableColumn setSortDescriptorPrototype:sortDescriptor];
}

写完这段初始化代码后,NSTableViewDataSource 有一个方法- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors 会在排序描述符发生变化时通知你,在数据源中实现这个方法并向数据数组发送消息进行排序

- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
{
    self.data = [self.data sortedArrayUsingDescriptors:sortDescriptors];
    [aTableView reloadData];
}

每次单击列标题时都会触发此方法,NSTableColumn 会显示一个漂亮的小三角形来显示排序顺序。

【讨论】:

    【解决方案2】:

    我在寻找实现类似功能的最简单方法时偶然发现了这个问题。虽然最初的问题很老,但我希望有人觉得我的回答有用!请注意,我使用的是 Xcode 5.1.1

    好的,你需要这样做:

    1. 选择要在表格中排序的实际列。
    2. 在属性检查器中,您需要填写两个字段:排序键和选择器。
    3. 在排序键字段中,您需要输入标识符的值。您的标识符的值位于您的身份检查器中。
    4. 在选择器字段中,您需要根据列中的对象类型输入合适的选择器方法。默认方法是;比较:

    基于 Mac 的 Table View 编程指南。 compare: 方法适用于 NSString、NSDate 和 NSNumber 对象。如果您的表格列仅包含字符串,您可能需要考虑使用 caseInsensitiveCompare: 方法,如果区分大小写不重要。但是,请考虑将这些方法签名替换为localizedCompare: 或localizedCaseInsensitiveCompare: 方法,以考虑用户的语言要求。

    最后,你需要在你的 Table View Controller 中声明 tableView:sortDescriptorsDidChange: 方法,格式如下:

    -(void)tableView:(NSTableView *)mtableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
    {
        [listArray sortUsingDescriptors: [mtableView sortDescriptors]];
        [tableView reloadData];
    }
    

    【讨论】:

    • 排序键字段应该是数据对象中的一个属性,而不是列的标识符。 (尽管它们可能相同)
    • 我们可以保持列标识符和数据对象属性相同
    【解决方案3】:

    最近遇到了同样的问题,无法对 tableView 进行排序。 我的做法:

    • 将您的 sortDescriptors 绑定到 tableview 的 arrayController
    • tableview 的 sortDescriptors 绑定到 Arraycontroller 的排序描述符
    • 在属性检查器中执行设置(参见上面 Tosin 的回答)

    非常适合我。无需为列或其他东西设置原型。

    【讨论】:

      【解决方案4】:

      非常感谢,这对我的问题很有用。 我的代码是这样的

      首先,在XIB界面中设置唯一值,比如name...

      - (void)viewDidLoad {
          [super viewDidLoad];
              self.itemTableView.dataSource = self;
              self.itemTableView.delegate = self;
              self.itemTableView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleRegular;
              self.itemTableView.usesAlternatingRowBackgroundColors = YES;
      
              for (NSTableColumn *tableColumn in self.itemTableView.tableColumns ) {
                  NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:tableColumn.identifier ascending:NO selector:@selector(compare:)];
              [tableColumn setSortDescriptorPrototype:sortDescriptor];
              }
      }
      
      -(void)tableView:(NSTableView *)tableView sortDescriptorsDidChange:(NSArray<NSSortDescriptor *> *)oldDescriptors{
          NSLog(@"sortDescriptorsDidChange:%@",oldDescriptors);
      
          [self.itemArr sortUsingDescriptors:[tableView sortDescriptors]];
      
          [self.itemTableView reloadData];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2016-01-30
        • 1970-01-01
        相关资源
        最近更新 更多