Gérer des onglets

08:20 modifié dans API AppKit #1
Bonjour,

Pour simplement améliorer mon application, je voudrais créer un système d'onglets à  la Safari (voir même Adium).
Exemple :
Je clique sur un bouton, une fenêtre d'exploration m'envoie sur un site web, un nouvel onglet se crée.
Je clique sur un autre, la fenêtre d'exploration se met au premier plan et m'ajoute un 2nd onglet et charge la nouvelle page.
Je reviens sur le premier onglet, la page n'aura pas à  se recharger, elle restera en mémoire.
Exactement comme Safari en fait.

Quelqu'un aurait une idée ? :o

Louka.

Réponses

  • muqaddarmuqaddar Administrateur
    08:20 modifié #2
    Bein pour les onglets tu fais des vues, avec détection des zones.
    Et quand tu cliques, tu peux par exemple faire une tabView sans afficher les tab et tu choisis le bon tab quand on clique ds la view/onglet.
  • 08:20 modifié #3
    Le problème c'est que je suis fâché avec les vues >:D
    Donc même avec ton explication, je ne vois pas comment procéder.
    à‰videmment une tabView c'est plus simple car les onglets se resize automatiquement si il y en a bcp. Mais je ne vois pas comment mémoriser chaque contenu de la webview :crackboom:-
  • 08:20 modifié #4
    Chaque tabview item a sa propre vue, tu as donc une instance de webview par tab. Et tant que tu ne fais rien sur la vue, son contenu ne sera donc pas modifié.
  • muqaddarmuqaddar Administrateur
    08:20 modifié #5
    Je pense que tu es obligé de créer une vue pour les onglets à  la safari... à  moins qu'on puisse sous classé l'intitulé des tabView mais je pense pas ?!
  • Eddy58Eddy58 Membre
    08:20 modifié #6
    dans 1139057593:

    Je pense que tu es obligé de créer une vue pour les onglets à  la safari... à  moins qu'on puisse sous classé l'intitulé des tabView mais je pense pas ?!

    En effet, à  ma connaissance, pour obtenir des onglets à  la Safari, une custom view est le seul moyen. :)
  • 08:20 modifié #7
    Est-ce que je dois ajouter un nib à  mon projet contenant une webview (ds une view) et agir comme un NSDocument ?
    Si oui, je n'aurai pas trop de problème à  le faire.
    Sinon, va me falloir de l'aide
  • février 2006 modifié #8

    Initialiser à  la volée une webview n'est vraiment pas dur: [[WebView alloc] initWithFrame:NSMakeRect(0.0,0.0,100.0,100.0)]; (la taille n'a pas vraiment d'importance, mais il faut initialiser avec initWithFrame: ) et après tu l'ajoutes dans un NSTabViewItem, également initialisé par code et tu rajoutes ce tabviewitem à  ta tabview (même si tu veux utiliser des tabs persos, il est plus simple d'utiliser une tabview sans tabs).
  • LeChatNoirLeChatNoir Membre, Modérateur
    08:20 modifié #9
    Slt,
    Fais une recherche sur PSMTabBarControl sous Google.
    Y a un gars qui a fait un module (palette IB+framework) que je trouve pas mal du tout.
    Par contre c'est sous licence BSD ou GPL je crois donc fais gaffe si ton appli n'est pas Open Source !

    Je l'ai récupéré et je trouve ça pas mal du tout.
    C'est complètement lié aux NSTabView par contre.

    a+
  • 08:20 modifié #10
    Bon ben j'ai réussi à  gérer les onglets avec une tabView (je ne pense pas pouvoir faire une tabView perso à  la Safari...)
    Le problème c'est que quand on supprime une tabView, j'aimerai que la webview initialisée soit relâchée ...
    <br />#import &quot;ViewerController.h&quot;<br /><br />#import &quot;ViewerWebView.h&quot;<br />#include &lt;WebKit/WebKit.h&gt;<br />@implementation ViewerController<br /><br />- (void)addTabViewItem:(NSNotification *)n<br />{<br />	NSDictionary *dico = [n object];<br />	NSTabViewItem *tabViewItem = [[NSTabViewItem alloc] initWithIdentifier:[dico objectForKey:@&quot;name&quot;]];<br />	[tabViewItem setLabel:[dico objectForKey:@&quot;name&quot;]];<br />	[tabView addTabViewItem:[tabViewItem autorelease]];<br /><br />	ViewerWebView *myWebView = [[ViewerWebView alloc] init];<br />	NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[[dico objectForKey:@&quot;URL&quot;] stringByAddingPercentEscapesUsingEncoding:NSMacOSRomanStringEncoding]]];<br />	[[myWebView mainFrame] loadRequest:request];<br />	int lastObject = ([tabView numberOfTabViewItems]-1);<br />	[[tabView tabViewItemAtIndex:lastObject] setView:[myWebView autorelease]];<br />	[popUp selectItemAtIndex:lastObject];<br />	[tabView selectLastTabViewItem:nil];<br />}<br /><br />- (IBAction)remove:(id)sender<br />{<br />    [tabView removeTabViewItem:[tabView selectedTabViewItem]];<br />}<br /><br />
    


    L'autorelease devrait marché non ? J'avous que je ne comprend pas très bien à  quel moment agit l'autorelease. Alors j'ai pense qu'à  partir du moment où je supprimerai un tabViewItem, son contenu sera automatiquement relâché (myWebView autorelease)...

    Louka.


    [Fichier joint supprimé par l'administrateur]
  • Eddy58Eddy58 Membre
    08:20 modifié #11
    <br />#import &quot;ViewerController.h&quot;<br /><br />#import &quot;ViewerWebView.h&quot;<br />#include &lt;WebKit/WebKit.h&gt;<br />@implementation ViewerController<br /><br />- (void)addTabViewItem:(NSNotification *)n<br />{<br />	NSDictionary *dico = [n object];<br />	NSTabViewItem *tabViewItem = [[NSTabViewItem alloc] initWithIdentifier:[dico objectForKey:@&quot;name&quot;]];<br />	[tabViewItem setLabel:[dico objectForKey:@&quot;name&quot;]];<br />	[tabView addTabViewItem:tabViewItem];<br />&nbsp; &nbsp;  [tabViewItem release];<br /><br />	ViewerWebView *myWebView = [[ViewerWebView alloc] init];<br />	NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[[dico objectForKey:@&quot;URL&quot;] stringByAddingPercentEscapesUsingEncoding:NSMacOSRomanStringEncoding]]];<br />	[[myWebView mainFrame] loadRequest:request];<br />	int lastObject = ([tabView numberOfTabViewItems]-1);<br />	[[tabView tabViewItemAtIndex:lastObject] setView:myWebView];<br />&nbsp; &nbsp; &nbsp; [myWebView release];<br />	[popUp selectItemAtIndex:lastObject];<br />	[tabView selectLastTabViewItem:nil];<br />}<br /><br />- (IBAction)remove:(id)sender<br />{<br />    [tabView removeTabViewItem:[tabView selectedTabViewItem]];<br />}<br /><br />
    


    L'autorelease permet de faire un release de ton objet peu aprés la fin de la méthode où est placé l'autorelease. En gestion mémoire, dans le cas présent tout ce dont tu as a te soucier, c'est de faire un release pour chaque init que tu as faites. La tabview fera un retain en interne sur le tabview item ajouté lors du addTabView, et le tabview item fera un retain en interne de la webview ajoutée. Ce petit monde effectuera des releases internes lors du removeTabViewItem. :)
    Sinon, petit détail, comme le dis Renaud plus haut, pour l'initialisation de la webview, il est conseillé d'utiliser l'initialisateur désigné initWithFrame.
  • 08:20 modifié #12
    dans 1139161782:

    L'autorelease permet de faire un release de ton objet peu aprés la fin de la méthode où est placé l'autorelease. En gestion mémoire, dans le cas présent tout ce dont tu as a te soucier, c'est de faire un release pour chaque init que tu as faites. La tabview fera un retain en interne sur le tabview item ajouté lors du addTabView, et le tabview item fera un retain en interne de la webview ajoutée. Ce petit monde effectuera des releases internes lors du removeTabViewItem. :)
    Sinon, petit détail, comme le dis Renaud plus haut, pour l'initialisation de la webview, il est conseillé d'utiliser l'initialisateur désigné initWithFrame.



    Okay merci pour les infos
    Je vais faire un [[WebView alloc] initWithFrame:NSMakeRect(0,0,0,0) frameName:nil groupName:nil];

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