[Résolu]NSOutlineView dans une view ajoutée à  la contentView

mybofymybofy Membre
janvier 2014 modifié dans API AppKit #1

Bonjour


 


J'ai trouvé le modèle de représentation d'une hiérarchie qui me convient,


cf. Problème avec NSOutlineView.


 


Dans la première application OutlineBis, tout se passe dans AppDelegate


et ça marche. 


https://github.com/mybofy/OutlineBis.git


 


Dans la seconde, je veux placer la NSOutlineView dans une view ajoutée à  la contentView :



[[_window contentView] addSubview:[_outlineViewCtrl view]];

Exécution OK mais NSOutlineView vide. 



https://github.com/mybofy/OutlineTreeView.git


 


La seule différence que je vois est dans le Controller Content du Tree Conrtoller qui est dans le premier cas à  : App Delegate


 


et dans le second cas à  : Shared User Defaults Controller


 


Mais il y en a peut-être d'autre que j'ai laissées passer.


 


Où est mon erreur ?



 


Réponses

  • Shared User Defaults Controller retourne des objets immutables. Attention à  les transformer en leur version mutable sous peine de crash.

  • J'ai avancé.


     


    J'ai créé une instance de NSSharedUserDefaults Controller qui contient des valeurs.


     


    Plus d'erreur de compile, mais rien ne s'affiche dans la NSOutlinView.


     


    Voici le zip de la nouvelle version : 

  • berfisberfis Membre
    janvier 2014 modifié #4

    J'avoue que je ne saisis pas très bien ton code.


     


    1- Pourquoi vouloir dériver NSUserDefaultsController? L'avantage de l'original, c'est de pouvoir être accessible de partout (shared instance). Pourquoi refaire ce que l'original fait très bien ? En plus, ta classe dérivée ne crée pas de shared instance...


     


    2- L'ordre dans lequel les objets sont chargés depuis leur nib n'est pas prévisible. Tu ne peux donc pas, dans l'awakeFromNib de l'un d'eux, faire référence à  des objets externes, qui n'ont peut-être pas encore été chargés. C'est probablement pour cela que tu obtiens NULL. Pour être sûr que tout est chargé et que les outlets sont fixés, il y a applicationWillFinishLaunching. Et pour savoir si la vue de ton contrôleur est chargée, il y a viewDidLoad.


  • Tu as raison.


     


    J'ai fini par y arriver.


     


    1. L'idée première de la dérivation de NSUserDefaultsController était d'isoler la création de l'arborescence des données. Une instance de NSObject ferait l'affaire, avec la création d'un NSDirectory dans NSUserDefaults.


    2. J'ai utilisé les awakeFromNib par simplicité, mais ce n'est évidemment pas la bonne solution.


     


    J'avais fait deux erreurs :


    1. La création du modèle de données était incomplète. Voici la version complète :



    NSDictionary* item2_2_1 = [NSDictionary dictionaryWithObjectsAndKeys: @Item 2.2.1, @itemName, [NSArray array], @children, nil];
    NSDictionary* item2_2_2 = [NSDictionary dictionaryWithObjectsAndKeys: @Item 2.2.2, @itemName, [NSArray array], @children, nil];
    NSArray *array2 = @[;item2_2_1, item2_2_2];
    NSDictionary* item2_1 = [NSDictionary dictionaryWithObjectsAndKeys: @Item 2.1, @itemName, [NSArray array], @children, nil];
    NSDictionary* item2_2 = [NSDictionary dictionaryWithObjectsAndKeys: @Item 2.2, @itemName, array2, @children, nil];
    NSArray *arra1 = @[;item2_1, item2_2];

    NSDictionary* item1 = [NSDictionary dictionaryWithObjectsAndKeys: @Item 1, @itemName, [NSArray array], @children, nil];
    NSDictionary* item2 = [NSDictionary dictionaryWithObjectsAndKeys: @Item 2, @itemName, arra1, @children, nil];
    NSDictionary* item3 = [NSDictionary dictionaryWithObjectsAndKeys: @Item 3, @itemName, [NSArray array], @children, nil];
    NSArray *array = @[;item1, item2, item3];
    [[NSUserDefaults standardUserDefaults] setObject:array forKey:@dataModel];

    2. Et surtout, dans le bind du Tree Controller vers la source de données (NSUserDefaultsController) il fallait faire :


Connectez-vous ou Inscrivez-vous pour répondre.