Petit pb d'interface

muqaddarmuqaddar Administrateur
19:25 modifié dans API AppKit #1
Salut,

Je charge un tableau à  partir d'un fichier plist avec des checkboxes, mais j'ai un petit pb d'interface, voir l'image jointe.

De plus, lorsque j'essaie de cocher/décocher les cases, rien ne change... c'est figé.

Mes checkBoxes sont des bool ds le code des dico.

[Fichier joint supprimé par l'administrateur]
«1

Réponses

  • muqaddarmuqaddar Administrateur
    avril 2005 modifié #2
    Je viens de passer les checkboxes en small, et la première est visible entièrement. En revanche, pas moyen de les centrer horizontalement, ni de changer leur état...

    Et la première ligne est quand même moins haute que les autres. zarbi.
  • cbrandtcbrandt Membre
    19:25 modifié #3
    dans 1112341926:

    Je viens de passer les checkboxes en small, et la première est visible entièrement. En revanche, pas moyen de les centrer horizontalement, ni de changer leur état...

    Et la première ligne est quand même moins haute que les autres. zarbi.


    il faut implémenter tableview:setobject:fortablecolumn.... dans le datasource...
    et on ne peut effectivement pas les centrer, sauf à  réduire la largeur de la colonne pour qu'elles aient l'air centrées...
  • muqaddarmuqaddar Administrateur
    19:25 modifié #4
    Ah oui, je suis bête, j'avais omis la troisième méthode parce que je n'avais pas eu à  sauvegarder mes tableaux jusque là .

    J'ai réduit la colonne et enlevé l'intitulé. C'est propre.

    Merci !
  • fouffouf Membre
    19:25 modifié #5
    Bizarre. J'ai moi aussi eu besoin de checkboxes dans une tableView, mais j'ai pas eu ce pb la. Peut-etre parce que j'utilisait les bindings. Quelqu'un sait ?
  • cbrandtcbrandt Membre
    19:25 modifié #6
    on ne peut pas le faire via IB (avec les bindings je ne sais pas)
    mais j'ai lu qu'on pouvait le faire en code (j'ai pas testé)
  • Eddy58Eddy58 Membre
    19:25 modifié #7
    dans 1112342781:

    et on ne peut effectivement pas les centrer, sauf à  réduire la largeur de la colonne pour qu'elles aient l'air centrées...

    On peut centrer les checkboxs, mais il faut les initialiser par programmation au lieu de le faire dans IB. :)
    Tu vires les cells dans IB, et tu rajoutes le code suivant dans awakeFromNib :

    [tt] NSButtonCell *switchButtonCell=[[NSButtonCell alloc] init];
    [switchButtonCell setButtonType:NSSwitchButton];
    [switchButtonCell setImagePosition:NSImageOnly];
    [switchButtonCell setTitle:@";"];
    [[maTableView tableColumnWithIdentifier:@identifier] setDataCell:switchButtonCell];
    [switchButtonCell release];
    [/tt]
  • wiskywisky Membre
    19:25 modifié #8
    Je remet le sujet en route ;)

    j'ai le même problème sauf que la case ne se coche pas et je n'arrive pas à  le faire.
    L'orsque l'on click elle ce grise par la sélection et revient en état non sélectioné. Comment mettre la valeur à  "true"? Par contre la valeur corespondante de la PLIST n'est pas en boolean. Que doit-je faire?
  • muqaddarmuqaddar Administrateur
    19:25 modifié #9
    As-tu bien implémenté la méthode tableview:setobject:fortablecolumn ?

    Il me semble que normalement, elle devrait passer en Bool par défaut dans le plist. Sinon, tu peux p-e essayer un setBool à  la place de setObject quand tu enregitres tes dictionnaires.
  • wiskywisky Membre
    19:25 modifié #10
    j'ai : tableview:setobjectvalue:fortablecolumn:row

    et après je met :
    if([object boolValue]==YES){<br />//code si oui<br />}<br />else{<br />//code si non<br />}
    


    je vai commencer par mettre ma PLIST en phase avec ma tableview en mettant le collone en boolean.
  • muqaddarmuqaddar Administrateur
    19:25 modifié #11
    Normalement, tu n'as pas à  te soucier de l'état de ton checkBox. Tu enregistres juste l'état de ta clé.
  • fouffouf Membre
    19:25 modifié #12
    un petit truc macintosh_plus :
    c'est mieux de mettre

    if([object boolValue]){
    [...]
    }else{ [...]}

    ;) Ca revient exactement au même et perso, je trouve ca plus lisible :P
  • wiskywisky Membre
    19:25 modifié #13
    dans ma plist la collone "recommander" est de type boolean et doit donner la valeur des checkbox. comment faire?
  • wiskywisky Membre
    19:25 modifié #14
    dans 1122987188:

    un petit truc macintosh_plus :
    c'est mieux de mettre

    if([object boolValue]){
    [...]
    }else{ [...]}

    ;) Ca revient exactement au même et perso, je trouve ca plus lisible :P


    merci je connait l'astuce mais je préfère mettre "== YES" pour être sûr, un reste de REALbasic :P
  • wiskywisky Membre
    août 2005 modifié #15
    dans 1122986422:

    Normalement, tu n'as pas à  te soucier de l'état de ton checkBox. Tu enregistres juste l'état de ta clé.


    comment faire pour modiffier mon dictionnaire? :o

    <edit>
    par défaut la valeurs dans la plist sont à  true et les checkbox ne sont pas cochées lors du reload des données :(
    </edit>
  • muqaddarmuqaddar Administrateur
    19:25 modifié #16
    Tu peux nous montrer le code quand tu reloades les données et les ranges dans les dictionnaires de ton array que tu passes dans les 3  méthodes datasource ? Et aussi le contenu de ces 3 méthodes.
  • wiskywisky Membre
    août 2005 modifié #17
    avant cette fonction il y a un test de connexion à  internet. Si la connexion réussi il fait ça:

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection<br />{<br />	[etats setStringValue:NSLocalizedStringFromTable(@&quot;COK&quot;, @&quot;Localizable&quot;, @&quot;A comment&quot;)];<br />	/* Maintenant qu&#39;on est connecté, on récupère le plist dans notre app :*/<br />	<br />	myArray = [[NSArray arrayWithContentsOfURL:[NSURL URLWithString:@&quot;http://www.monsite.com&quot;]] retain];<br />	[etats setStringValue:@&quot;Lecture...&quot;];<br />	/* Lecture de la liste reçu et création d&#39;une nouvelle liste avec seulement les éléments visibles */<br />	<br />	/* Lecture des informations du serveur */<br />	NSDictionary *dico2 = [myArray objectAtIndex:0];<br />	[etats setStringValue:[NSString stringWithFormat:NSLocalizedStringFromTable(@&quot;LecServ&quot;, @&quot;Localizable&quot;, @&quot;A comment&quot;),[dico2 objectForKey:@&quot;ServerName&quot;]]];<br />	[myArray removeObjectAtIndex:0];<br />	<br />	NSDictionary *fileversion;<br />	int index,veractu,vernew;<br />	NSString *ver,*itemver,*nomlog;<br />	index=0;<br /><br />	//initialisation du progress bar<br />	[progress setIndeterminate:NO];<br />	[progress setMaxValue:[myArray count]];<br />	[progress incrementBy:1];<br />	//fin init<br /><br />	/* Recherche des mise à  jour disponibles */<br />	while(index&lt;[myArray count]){<br />		[progress setDoubleValue:[progress doubleValue]+1];<br />		dico2 = [myArray objectAtIndex:index];<br />		nomlog = [dico2 objectForKey:@&quot;nomproduit&quot;];<br /><br />		[etats setStringValue:[NSString stringWithFormat:NSLocalizedStringFromTable(@&quot;LecApp&quot;, @&quot;Localizable&quot;, @&quot;A comment&quot;),nomlog]];<br />		if([[dico2 objectForKey:@&quot;telechargable&quot;] isEqualToString:@&quot;N&quot;]==YES) [myArray removeObjectAtIndex:index];<br />		else<br />		&nbsp; { <br />			fileversion = nil;<br />			itemver = nil;<br />			ver = nil;<br />			veractu = 0;<br />			vernew = 0;<br />			fileversion = [[NSDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@&quot;%@/Contents/%@&quot;,[dico2 objectForKey:@&quot;destination&quot;],[dico2 objectForKey:@&quot;emplacementversion&quot;]]] retain];<br />			itemver = [dico2 objectForKey:@&quot;itemversion&quot;];<br />			ver = [fileversion objectForKey:itemver];<br />			veractu = [ver intValue];<br />			vernew = [[dico2 objectForKey:@&quot;version&quot;] intValue];<br />			/* comparaison des versions. condition final : (veractu&lt;=vernew)*/<br />			if([ver isEqualTo:nil] || (veractu&lt;vernew)) [myArray removeObjectAtIndex:index]; /* supprimer si c&#39;est la même version ou si le logiciel n&#39;a pas été trouvé */<br />			else index++;<br />		&nbsp; }<br />	}<br />	/* fin recherche mise à  jour dispo */<br />	<br />	[myTableView reloadData];<br />	<br />	/* ajout des checkbox */<br />	id tPrototypeCell;<br />	tPrototypeCell = [[[NSButtonCell alloc] initTextCell: @&quot;&quot;] autorelease];<br />	[tPrototypeCell setButtonType:NSSwitchButton];//NSSwitchButton<br />	[tPrototypeCell setImagePosition:NSImageOnly]; // This line is useful if you want to center the checkbox<br />	[tPrototypeCell setControlSize:NSSmallControlSize];<br />	<br />	[CheckboxInList setDataCell:tPrototypeCell]; <br />	<br /><br />	/* Selection de la 1er ligne du tableau */<br />	[myTableView selectRow:0 byExtendingSelection:NO];<br />	<br />	/* On relâche la connexion */<br />	[connection release];<br />	<br />	/* Arrêter la progression */<br />	[progress setIndeterminate:YES];<br />	[progress stopAnimation:nil];<br />	if([myArray count]==0)<br />	&nbsp; {<br />		[etats setStringValue:NSLocalizedStringFromTable(@&quot;NMAJ&quot;, @&quot;Localizable&quot;, @&quot;A comment&quot;)];<br />		[self AlertInfos:NSLocalizedStringFromTable(@&quot;NMAJ&quot;, @&quot;Localizable&quot;, @&quot;A comment&quot;):NSLocalizedStringFromTable(@&quot;NMAJL&quot;, @&quot;Localizable&quot;, @&quot;A comment&quot;)];<br />	&nbsp; }<br />	else<br />	&nbsp; {<br />		[etats setStringValue:NSLocalizedStringFromTable(@&quot;Inactif&quot;, @&quot;Localizable&quot;, @&quot;A comment&quot;)];<br />		/* ouverture des propriétés */<br />		[Propriete open:self];<br />	&nbsp; }<br />}<br />
    



    cette fonction permet de savoir quand une checkbox à  la souris enfoncé :-\\
    - (void)tableView:(NSTableView *)aTableView setObject:(id)object<br />&nbsp;  forTableColumn:(NSTableColumn *)inColumn<br />{<br />	<br />		if ([object boolValue] == YES)<br />		{<br />			[etats setStringValue:@&quot;Activer&quot;];<br />		}<br />		else<br />		{<br />			[etats setStringValue:@&quot;Desactiver&quot;];<br />		}<br />	<br />}
    


    je code mal, je sais mais je débute et j'ai encore la lourdeur de REALbasic.

    <edit>
    je n'est pas de méthode "datasource"

    le PLIST:
    &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;<br />&lt;plist version=&quot;1.0&quot;&gt;<br />&lt;array&gt;<br />&lt;dict&gt;<br />&lt;key&gt;FileVersion&lt;/key&gt;<br />&lt;string&gt;3.0&lt;/string&gt;<br />&lt;key&gt;ServerName&lt;/key&gt;<br />&lt;string&gt;monsite.com&lt;/string&gt;<br />&lt;key&gt;IDPROD&lt;/key&gt;<br />&lt;string&gt;&lt;/string&gt;<br />&lt;/dict&gt;<br />&lt;dict&gt;<br /><br />&lt;key&gt;idproduit&lt;/key&gt;<br />&lt;key&gt;1&lt;/key&gt;<br />&lt;key&gt;codeproduit&lt;/key&gt;<br />&lt;string&gt;0&lt;/string&gt;<br />&lt;key&gt;poid&lt;/key&gt;<br />&lt;string&gt;1,29 Mo&lt;/string&gt;<br />&lt;key&gt;telechargable&lt;/key&gt;<br />&lt;string&gt;N&lt;/string&gt;<br />&lt;key&gt;nomproduit&lt;/key&gt;<br /><br />&lt;string&gt;xNetUpdate 0.9.5&lt;/string&gt;<br />&lt;key&gt;version&lt;/key&gt;<br />&lt;string&gt;095&lt;/string&gt;<br />&lt;key&gt;emplacementversion&lt;/key&gt;<br />&lt;string&gt;version.plist&lt;/string&gt;<br />&lt;key&gt;typefichierversion&lt;/key&gt;<br />&lt;string&gt;XML&lt;/string&gt;<br />&lt;key&gt;itemversion&lt;/key&gt;<br />&lt;string&gt;CFBundleVersion&lt;/string&gt;<br /><br />&lt;key&gt;format&lt;/key&gt;<br />&lt;string&gt;000&lt;/string&gt;<br />&lt;key&gt;destination&lt;/key&gt;<br />&lt;string&gt;/Applications/xNetUpdate.app&lt;/string&gt;<br />&lt;key&gt;recommander&lt;/key&gt;<br />&lt;true/&gt;<br />&lt;/dict&gt;<br />&lt;dict&gt;<br />&lt;key&gt;idproduit&lt;/key&gt;<br />&lt;key&gt;3&lt;/key&gt;<br /><br />&lt;key&gt;codeproduit&lt;/key&gt;<br />&lt;string&gt;FIRENZEPRO&lt;/string&gt;<br />&lt;key&gt;poid&lt;/key&gt;<br />&lt;string&gt;3,44 Mo&lt;/string&gt;<br />&lt;key&gt;telechargable&lt;/key&gt;<br />&lt;string&gt;O&lt;/string&gt;<br />&lt;key&gt;nomproduit&lt;/key&gt;<br />&lt;string&gt;Firenze&lt;/string&gt;<br />&lt;key&gt;version&lt;/key&gt;<br /><br />&lt;string&gt;181&lt;/string&gt;<br />&lt;key&gt;emplacementversion&lt;/key&gt;<br />&lt;string&gt;version.plist&lt;/string&gt;<br />&lt;key&gt;typefichierversion&lt;/key&gt;<br />&lt;string&gt;XML&lt;/string&gt;<br />&lt;key&gt;itemversion&lt;/key&gt;<br />&lt;string&gt;CFBundleVersion&lt;/string&gt;<br />&lt;key&gt;format&lt;/key&gt;<br />&lt;string&gt;000&lt;/string&gt;<br /><br />&lt;key&gt;destination&lt;/key&gt;<br />&lt;string&gt;/Applications/Firenze.app&lt;/string&gt;<br />&lt;key&gt;recommander&lt;/key&gt;<br />&lt;true/&gt;<br />&lt;/dict&gt;<br />&lt;/array&gt;<br />&lt;/plist&gt;
    

    </edit>
  • Eddy58Eddy58 Membre
    19:25 modifié #18
    Apparemment, "etats" est un textfield, auquel cas ça ne fonctionne pas du tout ainsi, connais tu le pattern MVC ? Les méthodes delegates DataSource de NSTableView sont faites pour communiquer avec ton modèle. Il faut revoir ta conception je crois... :o
  • wiskywisky Membre
    19:25 modifié #19
    "etats" n'est là  que pour dire ce que faire le logiciel. Il n'est pas lié à  la table view. C'est bien un textfield.


    PS:désolé, j'ai editer plusieur fois mon précedent message.
  • Eddy58Eddy58 Membre
    19:25 modifié #20
    dans 1122990048:

    "etats" n'est là  que pour dire ce que faire le logiciel. Il n'est pas lié à  la table view. C'est bien un textfield.

    Oui, mais ce n'est pas dans une DataSource que ça se traite. Ta DataSource est là  pour remplir ta tableview selon ton modèle de données, et à  la vue de ton code c'est la première chose à  restructurer correctement si tu veux que le reste suive :)
  • wiskywisky Membre
    19:25 modifié #21
    dans 1122990253:

    dans 1122990048:

    "etats" n'est là  que pour dire ce que faire le logiciel. Il n'est pas lié à  la table view. C'est bien un textfield.

    Oui, mais ce n'est pas dans une DataSource que ça se traite. Ta DataSource est là  pour remplir ta tableview selon ton modèle de données, et à  la vue de ton code c'est la première chose à  restructurer correctement si tu veux que le reste suive :)


    je veux bien mais comment??

    PS: je suis débutant et autodidact sans bouquin.
  • muqaddarmuqaddar Administrateur
    19:25 modifié #22
    Prends une heure pour faire ce tutorial en français qui explique ben le datasource : http://www.projectomega.org/article.php?lg=fr&php=oreilly_cocoa10&p=1
    et ensuite, tu rigoleras de tout ça. ;)

    N'hésite pas à  poser des questions si tu piges pas un truc.
  • wiskywisky Membre
    19:25 modifié #23
    Ok, ma façon de programmer n'est pas standard. Maintenant je sais comment ça marche.

    Mais cela ne ma pas résolu mon problème avec cette fichier checkbox. elle ne s'active toujour pas.
  • muqaddarmuqaddar Administrateur
    19:25 modifié #24
    Montre nous tes 3 méthodes datasource maintenant.
  • wiskywisky Membre
    19:25 modifié #25
    - (int)numberOfRowsInTableView:(NSTableView *)aTableView<br />{<br />	return [myArray count];<br />}<br /><br />- (id)tableView:(NSTableView *)aTableView<br />&nbsp; &nbsp; &nbsp; objectValueForTableColumn:(NSTableColumn *)aTableColumn<br />			row:(int)rowIndex<br />{<br />	id theRecord, theValue;<br />	theRecord = [myArray objectAtIndex:rowIndex];<br />	theValue = [theRecord objectForKey:[aTableColumn identifier]];<br />&nbsp; &nbsp; return theValue;<br />}<br />
    


    J'ai ça, comme dans le tuto.
  • muqaddarmuqaddar Administrateur
    19:25 modifié #26
    Il manque celle qui enregistre les changements.

    Montre aussi le code où tu remplis myArray (que ce code).
  • fouffouf Membre
    19:25 modifié #27
    Que veux-tu dire par "la checkbox ne s'active pas" ?
    Elle reste grisée ou quand tu clique dessus, ce ne fait rien ?

    Autre remarque : la gestion mémoire.
    Dans le code de - (void)connectionDidFinishLoading:(NSURLConnection *)connection tu fais myArray = NSArray arrayWithContentsOfURL:[NSURL URLWithString:@&quot;http://www.monsite.com&quot; retain]; Deux choses
    1° si tu utilises des méthodes d'initialisations de classe (du genre +array... ou +stringWith...) tu n'as pas besoin de faire un retain. En effet, ces valeurs sont autoreleasé. Ensuite, tu ne fais justement pas de release sur la valeur. C'est un coup à  te créer une fuite de mémoire.

    2° myArray est, si je ne me trompe, une variable d'instance. Donc, au lieu de faire un "appel autoreleasé", le mieux est de faire un alloc-init. Donc, pour myArray = NSArray arrayWithContentsOfURL:[NSURL URLWithString:@&quot;http://www.monsite.com&quot; retain];, tu peux remplacer par :
    <br />[myArray release];<br />myArray = [[NSArray alloc] initWithContentOfURL:[NSURL URLWithString:@&quot;http://www.monsite.com&quot;];<br />
    


    Comme ca, ca t'évite une fuite de mémoire ou bien encore que ta variable soit autoreleasé au plein milieu de ton prog, alors que tu en as encore besoin ;)

    Voila, je sais pas si ces remarque te seront utiles, mais c'est toujours un bon truc à  signaler :fouf):
  • wiskywisky Membre
    août 2005 modifié #28
    dans 1123151007:

    Il manque celle qui enregistre les changements.

    Montre aussi le code où tu remplis myArray (que ce code).


    Je n'enregistre pas les modifications ell sont réalisé de façon automatique à  chaque fois.

    Que veux-tu dire par "la checkbox ne s'active pas" ?
    Elle reste grisée ou quand tu clique dessus, ce ne fait rien ?


    On peut cliquer sur les checkbox. lorsque tu le fait, elle devient foncé puis redevient comme avant.

    <edit>
    j'ai un soussi, les checkbox n'apparaissent plus :'( . voici le code :
    id tPrototypeCell;<br />	tPrototypeCell = [[[NSButtonCell alloc] initTextCell: @&quot;&quot;] autorelease];<br />	[tPrototypeCell setButtonType:NSSwitchButton];//NSSwitchButton<br />	[tPrototypeCell setImagePosition:NSImageOnly]; // This line is useful if you want to center the checkbox<br />	[tPrototypeCell setControlSize:NSSmallControlSize];<br />	<br />	[[myTableView tableColumnWithIdentifier: @&quot;recommander&quot;] setDataCell:tPrototypeCell];
    

    </edit> :crackboom:-
  • wiskywisky Membre
    19:25 modifié #29
    ça marche  :adios!: :adios!: :adios!: :adios!: :adios!:
    j'avais un problème d'interface. En fait j'avais 2langue dans mon projet et je ne modiffiait que l'anglais allor que c'est le français qui s'affichait.

    Je n'est pas envore réussi à  changer la valeur de la checkbox mais ça ne va pas trader. :p
  • wiskywisky Membre
    19:25 modifié #30
    j'ai encore un problème :
    pour désactiver tout va bien mais pour activer il plante :
    - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)object<br />&nbsp;  forTableColumn:(NSTableColumn *)inColumn row:(int)inRow<br />{<br />	NSDictionary *dico2 = [NSDictionary alloc]; <br />	dico2 = [myArray objectAtIndex:inRow];<br />	if([object boolValue] == NO){<br />		[dico2 setValue:NO forKey:@&quot;recommander&quot;];<br />		[etats setStringValue:[NSString stringWithFormat:@&quot;Désactiver&quot;]];<br />	}else{<br />		[dico2 setValue:YES forKey:@&quot;recommander&quot;];<br />		[etats setStringValue:[NSString stringWithFormat:@&quot;Activer&quot;]];<br />	}<br />	[myTableView reloadData];<br />	<br />} <br />
    
  • BruBru Membre
    19:25 modifié #31
    Beaucoup de choses sont à  revoir dans ton bout de code :

    1. [tt]NSDictionary *dico2 = [NSDictionary alloc];[/tt] : cette ligne est inutile, et pire, elle provoque un memory-leak. Supprime là  !

    2. [tt]if([object boolValue] == NO)[/tt] : je suppose que object est ta checkbox... Dans ce cas, ce n'est pas la "value" que tu dois récupérer, mais le "state". En plus, le "state" n'est pas un BOOL mais un int. Remplace par : [tt]if([object state] == NSOffState)[/tt].

    3. [tt][dico2 setValue:NO forKey:@recommander];[/tt] : setValue attend un objet, or tu lui envoies un BOOL, autrement dit, ça plante ! Remplace par [tt][dico2 setValue:[NSNumber numberWithBool:NO] forKey:@recommander];[/tt].

    4. idem pour [tt][dico2 setValue:YES forKey:@recommander];[/tt].

    5. [tt][myTableView reloadData];[/tt] : évite reloadData dans les méthodes du dataSource.

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