Navigation Controller et View

CeetixCeetix Membre
janvier 2013 modifié dans API AppKit #1
Salut tout le monde,



Je me penche un peu sur le dev Mac OS et j'ai implémenté un système de navigation controller pour mes besoins.

Donc en gros j'ai :


@interface NXNavigationController : NSViewController<br />
<br />
@property (nonatomic, retain) NXViewController *visibleViewController;<br />
@property (nonatomic, retain) NSMutableArray *viewControllers;<br />
<br />
- (id)initWithRootViewController:(NXViewController *)rootViewController andWindowFrame:(NSRect)frame;<br />




et


- (id)initWithRootViewController:(NXViewController *)rootViewController andWindowFrame:(NSRect)frame<br />
{<br />
	self = [super initWithNibName:nil bundle:nil];<br />
	if(self)<br />
	{<br />
		if(rootViewController)<br />
		{		  <br />
			_viewControllers = [[NSMutableArray alloc] initWithObjects:rootViewController, nil];<br />
			[rootViewController setNavigationController:self];<br />
		  <br />
			self.visibleViewController = rootViewController;<br />
			[self.view addSubview:rootViewController.view];<br />
		}<br />
	}<br />
	return self;<br />
}<br />




ensuite par exemple dans mon AppDelegate je commence par :


HomeViewController *rootController = [[[HomeViewController alloc] initWithNibName:@&quot;HomeViewController&quot; bundle:nil] autorelease];<br />
_navigationController = [[NXNavigationController alloc] initWithRootViewController:rootController andWindowFrame:NSZeroRect];<br />
[self.window setContentView:_navigationController.view];<br />




Ca marche bien j'arrive ensuite à  naviguer et tout MAIS sur ma première vue j'ai ma vue designé dans mon nib qui apparait deux fois et je pige pas pourquoi ...



Si je commente :
[self.view addSubview:rootViewController.view];<br />




Ca marche j'ai bien la vue qui s'affiche sans doublons mais par contre le système de navigation est cassé vu que c'est une vue n'appartenant apparemment pas à  mon controlleur.

Si dans mon AppDelegate j'ajoute à  la fin :
for(NSView *view in [_navigationController.view subviews])<br />
{<br />
   NSLog(@&quot;%@&quot;,view);<br />
	if([view isKindOfClass:[NSView class]])<br />
	{<br />
		for(NSView *sview in [view subviews])<br />
		 NSLog(@&quot;%@&quot;,sview);<br />
	 }<br />
}<br />




J'ai bien le contenu de ma vue puis un NSView qui contient exactement les même éléments de la vue.



Je loupe surement un truc mais ... lequel ?

Je joins un screen pour vous faire une idée.
Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur
    janvier 2013 modifié #2
    J'ai beau regarder ton code, je ne saurais dire.

    T'aurais pas un truc dans NXViewController qui entrerait en conflit ?



    (P.S. La notion de visibleViewController est inutile. C'est forcément le dernier élément de viewControllers).
  • Dans ma classe NXViewController j'ai :


    @interface NXViewController : NSViewController<br />
    @property (nonatomic, retain) NXNavigationController *navigationController;<br />
    - (void)viewWillAppear;<br />
    - (void)viewDidAppear;<br />
    - (void)viewWillDisappear;<br />
    - (void)viewDidDisapear;<br />
    


    et
    <br />
    @implementation NXViewController<br />
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil<br />
    {<br />
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];<br />
        if (self) {<br />
        }<br />
       <br />
        return self;<br />
    }<br />
    - (void)dealloc<br />
    {<br />
        [super dealloc];<br />
    }<br />
    <br />
    - (void)viewWillAppear<br />
    {<br />
       <br />
    }<br />
    //etc ...<br />
    




    P.S oui il faut le setter quand on a plus d'un controlleur.
  • CeetixCeetix Membre
    janvier 2013 modifié #4
    Bon j'ai trouvé le problème. J'avais un loadView dans ma classe de navigation. Par contre une fois enlevé, plus rien ne se charge ...



    EDIT : en fait non c'est foireux
  • Intéressant, il semble que même ça m'affiche la vue de rootController :


    <br />
    HomeViewController *rootController = nil;<br />
    _navigationController = [[NXNavigationController alloc] initWithRootViewController:rootController andWindowFrame:NSZeroRect];<br />
    [self.window setContentView:_navigationController.view];<br />
    




    Je suis pas fou, c'est le seul endroit dans mon code où j'instancie ma classe HomeViewController ...
  • Je suis tombé sur ce repo. Le mec passe par un protocol alors que moi je sous classe un NSViewController. A votre avis, quelle méthode est à  utiliser ?



    Sinon j'ai toujours pas résolu mon soucis mais je ne désespère pas lol
  • CéroceCéroce Membre, Modérateur
    janvier 2013 modifié #7
    Comme nous n'avons vu que des bribes de ton code, c'est toujours aussi opaque pour nous...



    Mais a priori, un Navigation Controller est un View Controller, donc l'héritage a du sens. Alors qu'un protocole non, puisqu'il va falloir fournir une bonne partie de l'implémentation. D'ailleurs, il rarissime de sous-classer UINavigationController.
  • Maintenant j'ai :


    <br />
    - (id)initWithRootViewController:(NXViewController *)rootViewController andWindowFrame:(NSRect)frame<br />
    {<br />
    	    self = [super initWithNibName:nil bundle:nil];<br />
    	    if(self)<br />
    	    {<br />
    			    if(rootViewController)<br />
    			    {				<br />
    					    _viewControllers = [[NSMutableArray alloc] initWithObjects:rootViewController, nil];<br />
    					    [rootViewController setNavigationController:self];<br />
    				 <br />
    					    self.visibleViewController = rootViewController;<br />
    			    }<br />
    	    }<br />
    	    return self;<br />
    }<br />
    <br />
    - (void)loadView<br />
    {<br />
        [super loadView];<br />
        [self.view addSubview:_visibleViewController.view];<br />
    }<br />
    




    C'est vraiment tout ce que j'utilise pour le moment. Dans mon AppDelegate j'instancie de la même manière que iOS (sauf que NSWindow n'a pas de propriété rootViewController).
  • CéroceCéroce Membre, Modérateur
    Est-ce que loadView est bien appelée ?

    ça ne me paraà®t pas évident si le view controller n'utilise pas de nib.
  • CeetixCeetix Membre
    janvier 2013 modifié #10
    J'ai réglé mon problème et je n'appelle plus loadview


    self.view = [[[NSView alloc] initWithFrame: frame] autorelease];<br />
    self.view.autoresizingMask = NSViewMinXMargin | NSViewMaxXMargin | NSViewMinYMargin | NSViewMaxYMargin | NSViewWidthSizable | NSViewHeightSizable;<br />
    		  <br />
    rootViewController.navigationController = self;<br />
    rootViewController.view.autoresizingMask = self.view.autoresizingMask;<br />
    rootViewController.view.frame = self.view.bounds;<br />
    _viewControllers = [[NSMutableArray alloc] initWithObjects:rootViewController, nil];<br />
    self.visibleViewController = rootViewController;<br />
    [self.view addSubview:_visibleViewController.view];<br />
    
Connectez-vous ou Inscrivez-vous pour répondre.