2014-09-30 3 views
0

У меня есть приложение, которое отображает массив объектов в 6 столбцах NSTableView. Пользователь может отображать список через любой порядок сортировки столбцов, который они предпочитают. NSTableView в XIB-файле использует функцию автосохранения, так что порядок сортировки сохраняется при запуске приложений. Все работает хорошо.чтение Autosave'd NSSortDescriptor's из NSTableView

Есть моменты, когда я хочу знать, что предпочитает порядок сортировки пользователя до этот конкретный загружаемый файл NSTableView загружается. Я хотел бы прочитать эти настройки порядка сортировки из файла настроек, чтобы отсортировать массив в соответствии с их предпочтениями, но без загрузки из XIB-файла, содержащего этот NSTableView.

Я могу видеть дескрипторы сортировки, сохраненные в файле настроек стандартныхUserDefaults моего приложения. Это массив с 12 элементами в нем (0-11), а четные элементы (0,2,4,6,8,10) показаны как данные и нечетные элементы (1,3,5,7,9) , 11) являются булевыми.

В документации сказано, что NSSortDescriptor соответствует NSSecureCoding, но если я экземпляр NSKeyedUnarchiver с одним из элементов данных, я получаю: «не шпонкой архив не может быть расшифрован с помощью NSKeyedUnarchiver» Если я использую NSUnarchiver, я получаю : «* Конец архива преждевременно встречается на 58»

В любом случае, логические элементы в массиве являются «восходящий» флаг свойство NSSortDescriptor и поэтому он даже не будет включен, если делает выше. Итак, я думаю, мне нужно каким-то образом объединить два элемента, чтобы получить кодированный дескриптор сортировки? Кто-нибудь имеет представление о том, как декодировать дескрипторы сортировки «autosaved»?

ответ

0

это решение работает для меня: (пожалуйста, игнорировать все ZSAsserts) его метод в подклассе/категории NSTableView

-(void) zsSetTableLayoutFromAutosaveName:(NSString*) autosaveName{ 
 
    
 
    // set initial sortDescriptors 
 
    int i = 0; 
 
    NSString* columnName = @""; 
 
    NSMutableArray* sortDescriptors = [NSMutableArray new]; 
 
    for (id data in [[NSUserDefaults standardUserDefaults] valueForKey:[NSString stringWithFormat:@"NSTableView Sort Ordering %@",autosaveName]]) { 
 
     if (i%2 == 0) { 
 
      ZSAssert([data isKindOfClass:[NSData class]]); 
 
      columnName = [NSUnarchiver unarchiveObjectWithData:data]; 
 
     } 
 
     else { 
 
      ZSAssert([data isKindOfClass:[NSNumber class]]); 
 
      BOOL ascending = [((NSNumber*) data) boolValue]; 
 
      [sortDescriptors addObject:[NSSortDescriptor sortDescriptorWithKey:columnName ascending:ascending]]; 
 
     } 
 
     i++; 
 
    } 
 
    [self setSortDescriptors:sortDescriptors]; 
 
    
 
    // set intial hidden-state 
 
    for (NSData* data in [[NSUserDefaults standardUserDefaults] valueForKey:[NSString stringWithFormat:@"NSTableView Hidden Columns %@",autosaveName]]) { 
 
     ZSAssert([data isKindOfClass:[NSData class]]); 
 
     NSString* colName = [NSUnarchiver unarchiveObjectWithData:data]; 
 
     ZSAssert([colName isKindOfClass:[NSString class]]); 
 
     NSTableColumn* tc = [self tableColumnWithIdentifier:columnName]; 
 
     if (!tc.isHidden){ 
 
      [tc setHidden:YES]; 
 
     } 
 
    } 
 
    
 
    // set initial width 
 
    i = 0; 
 
    for (id data in [[NSUserDefaults standardUserDefaults] valueForKey:[NSString stringWithFormat:@"NSTableView Columns %@",autosaveName]]) { 
 
     if (i%2 == 0) { 
 
      ZSAssert([data isKindOfClass:[NSData class]]); 
 
      columnName = [NSUnarchiver unarchiveObjectWithData:data]; 
 
     } 
 
     else { 
 
      ZSAssert([data isKindOfClass:[NSString class]]); 
 
      float width = ((NSString*) data).floatValue; 
 
      [[self tableColumnWithIdentifier:columnName] setWidth:width]; 
 
     } 
 
     i++; 
 
    } 
 
    
 
    [self setAutosaveName:autosaveName]; // from now on, every change made to the table should be automatically persisted into user-defaults 
 
    [self setAutosaveTableColumns:YES]; 
 
}

Смежные вопросы