Como posso tornar o desenho do NSCOLLECTIONVIEW antes da vista que a contê -lo é visível?
-
28-09-2019 - |
Pergunta
Estou tentando limpar a interface do usuário no meu aplicativo (construído para 10.5) e uma coisa que é bastante irritante é que, quando troco para a biblioteca, recarregue o conteúdo e o NSCOLLECTIONV que exibe os itens desaparecem o conteúdo antigo antes de desbafar o Novos em. Não me importo com o desbotamento de itens antigos/novos, mas a maneira como eu programei a troca de visualização deve fazer a biblioteca recarregar antes que o NSView que contenha o NSCollectionView seja inserido na janela principal .
Alguém teve esse tipo de problema antes?
Aqui está uma versão resumida de como é a troca entre diferentes partes do aplicativo para a biblioteca:
No controlador principal:
-(void)setMainPaneToLibrary {
if(viewState == VIEW_STATE_LIBRARY)
return;
[libraryController refreshDevices:self];
[libraryController refreshLibraryContents];
[menuController setSelectionToIndex:0];
viewState = VIEW_STATE_LIBRARY;
[self removeSubview]; //clear the area
[mainPane addSubview:[libraryController view]];
}
No controlador da biblioteca:
-(void)refreshLibraryContents {
[self loadLibraryContents:[rootDir stringByAppendingPathComponent:currentDir]];
}
-(void)loadLibraryContents:(NSString *)folderToLoad {
int i;
int currentSelection = [libraryArrayController selectionIndex]; //used to preserve selection and smooth folder changing
[libraryArrayController setContent:nil];
//expand the path to load
folderToLoad = [folderToLoad stringByExpandingTildeInPath];
NSFileManager * fileManager = [NSFileManager defaultManager];
//load the files in the folder
NSArray * contents = [fileManager directoryContentsAtPath:folderToLoad];
//create two seperate arrays for actual files and folders - allows us to add them in order
NSMutableArray * directories = [[NSMutableArray alloc] init];
NSMutableArray * musicFiles = [[NSMutableArray alloc] init];
//... a load of stuff filling the file arrays ...
for(i=0;i<[directories count];i++) {
[libraryArrayController addObject:[directories objectAtIndex:i]];
}
for(i=0;i<[musicFiles count];i++) {
[libraryArrayController addObject:[musicFiles objectAtIndex:i]];
}
if(currentSelection >= 0) {
[libraryArrayController setSelectionIndex:currentSelection];
}
[directories release];
[musicFiles release];
}
Solução
A questão não é que a visualização da coleção não tenha terminado de desenho, é que ele anima a adição e a remoção das subviews. Pode ser possível criar uma transação Isso desativa as ações da camada enquanto você está recarregando o conteúdo da coleção. Listagem 2 (Desativar temporariamente as ações de uma camada) mostra como fazer isso. Eu não testei isso, então não sei se isso fará o que você quiser, mas é aqui que eu começaria.