sortingsetnsarraycontrollernstablecolumn

How do you Sort Bound Data in NSTableColumn using InterfaceBuilder binding?


Sorting Bound Data in NSTableColumn using IB binding.

Keys: NSTableColumn , sorting, NSArrayController, Content Set

A contentSet serves like a data source for a TableColumn

This deals with a SplitView with two single column NSTableViews The names of the TableViews are BookCategory and Books. The Books Table has a single column with book_titles. The Class BookCategory has a one to many relationship to Book.

The BookCategory Table is sorted at load using:

@implementation MyBookCategoryController

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
       NSSortDescriptor *descript = 
       [NSSortDescriptor sortDescriptorWithKey:@"name"
                    ascending:YES selector:@selector(caseInsensitiveCompare:)];

       [self setSortDescriptors:[[NSArray arrayWithObject:descript] autorelease] ];

    }
    return self;
}

This same approach fails to sort the BookTitle table at load.  !!

The BookTitle table/column loads unsorted.

For the TableColumn the Attributes Inspector has  
 Sort Key:title
 Selector: caseInsensitiveCompare:
 Order: Ascending

This appears to enable the sorting when one clicks on the column header.

I want the data sorted when the view loads. 

The binding inspector for this book_title column has:
 Value : BookCategoryArrayController.arrangedObjects.name

The BookTitleArrayController in binding inspector shows 
 Content Set: Book Category ArrayController.selection.books

To restate the problem, the tableview with the book titles load unsorted. It sorts only after the user's FIRST click on the column header.

Say there are three book categories Art, History, Sports. When the app loads the left table in the splitview is sorted, that is :

Art
History
Sports

When the user selects ANY category, titles for all books in the category appear in the right tableView but unsorted. If the user clicks on the Header of the book_title TableColumn the initial sorting is done on the column. Thereafter the selection of ANY book category causes a sorted display of book_titles in the right tableView. That is, ONLY the first selection of a category results in an Unsorted book title list.

Thanks a lot for reading, Mark


Solution

  • This is an outline of what finally worked for me.

                Sorting with CategoryArrayController (NSArrayController)
    
          Bindings Inspector
             Content Set  Bind to: CategoryArrayController.selection.books
    
             SortDescriptors Bind to: ShareUserDefaultsController
              Controller Key: values
              sortDescriptors  (note:  exclamation point)
              NSUnarchiveFromData
    
        Shared User Defaults Controller 
            Referencing Outlets
              userDefaultsController -- AppController (C:AppController)
            Referencing Bindings
                values.sortDescriptors -- Sort Descriptors Rx Array Controller (C:NSArrayController)
                                       -- Sort Descriptors Category Array Controller (C:NSArrayController)  
    
          Clicking on Category Header does no sort. Selects all in Cats, and empties Recipe Table
          Comments on the above welcome.
    
        TableViewCat (NSTableController)
            Attributes Inspector
              TableView
                Selection 
                    Empty,Column,Type Select
              Control
                 State.Enabled
            Connections Inspec
                None
            Bindings Inspec
                None
    
          TableColumn -Category (NSTableColumn)
            Attributes Inspec
                Sort Key : None
            Bindings Inspec
                Value -- Category Array Controller.arrangedObjects.name
    
    
        Sorting with RxArrayController (C:NSArrayController)
          Attributes Inspec
             Array Controller: 1-5 of 6
             Object Controller
               EntityName: Recipe
                 Prepares Content
                 Editable
          Connections Inspector
            Referencing Bindings
              arrangedObjects.name -- Value - Table Column Recipe
              selectedObjects      -- Double Click Argument - Table View Book
          Bindings Inspector
           Controller Content
             Content Set
               Category Array Controller.selection.books
           Controller Content Parameters    
             Sort Descriptors Bind to: ShareUserDefaultsController
              Controller Key: values
              sortDescriptors  (note:  exclamation point)
              NSUnarchiveFromData
            Parameters  
              Managed Object Context(App Delegate.manangedObjectContext
    
        TableView Book (NSTableView)
            Attributes Inspector
              TableView
                Selection Empty,Column,Type Select
              Control
                State.Enabled
            Connections Inspec
                Bindings
                    DoubleClick Argument -- Book Array Controller.selectedObjects
                    Double Click Target  -- App Delegate.self
            Bindings Inspec
                Double Click Argument (Book Array Controller.selectedObjects)
                Double Click Target (App Delegate.self)
                    Bind To: App Delegate
                        Model Key Path: self  (Repeats ?)
                        Selector Name: newBookAction: 
                          Conditionally Sets Enabled
    
          TableColumn - Book (NSTableColumn)
            Attributes Inspec
                Sort Key : None
            Connections Inspec
                Bindings
                    Value -- Book Array Controller.arrangedObjects.name
            Bindings Inspec
                Value -- Book Array Controller.arrangedObjects.name