NSMenu limite capacité?

RocouRocou Membre
02:48 modifié dans API AppKit #1
Bonjour,

Pour alimenter des NSpopupButton J'utilise une méthode qui jusqu'à  présent fonctionnait très bien.
Or ma nouvelle application plante sur cette méthode. En jouant sur le nombre d'éléments, l'application fonctionne ou plante (trop d'éléments?).

Est-ce un problème d'allocation? De limite de capacité de NSMenu?

Voici mon code:

- (void) initPopClient:(id)sender<br />{<br />	NSDictionary *leDico;<br />	PGSQLRecordset *rs;<br />	<br />	NSMenu *popClientMenu = [[[NSMenu alloc] init] autorelease];<br />	<br />	[popClient removeAllItems];<br />	<br />	NSString *query = @&quot;SELECT nom, id FROM clients ORDER BY nom&quot;;<br />	<br />	rs = [connection open:query];<br />	if (rs != nil) {<br />		if (![rs isEOF])<br />		{<br />			NSInteger i=0; <br />			<br />			while (![rs isEOF])<br />			{<br />				<br />				leDico=[rs dictionaryFromRecord];<br />				<br />				[popClient addItemWithTitle:[leDico valueForKey:@&quot;nom&quot;]];<br />				<br />				//Association de l&#39;identifiant PostgreSQL avec le titre du PopPup (nom du client)<br />				NSString *k=[leDico valueForKey:@&quot;id&quot;];<br />				NSInteger j=[k integerValue];<br />				<br />				popClientMenu = [popClient menu];<br />				[[popClientMenu itemAtIndex:i] setTag:j]; //************ça plante ici!<br />	<br />				<br />				i=i++;<br />				[rs moveNext];<br />			}&nbsp; &nbsp; <br />			<br />			<br />		}<br />		<br />		<br />	} else <br />	{<br />		NSLog(@&quot;Impossible de récupérer les données: %@&quot;, [connection lastError]);<br />	}<br />	[rs close];&nbsp; &nbsp; <br />}<br />

Réponses

  • CéroceCéroce Membre, Modérateur
    02:48 modifié #2
    Quel est le type de popClient ?

    Vérifie que [popClientMenu itemAtIndex:i] renvoie bien quelque chose.
  • RocouRocou Membre
    02:48 modifié #3
    dans 1246441216:

    Quel est le type de popClient ?


    IBOutlet NSPopUpButton *popClient;

    dans 1246441216:

    Vérifie que [popClientMenu itemAtIndex:i] renvoie bien quelque chose.


    Dans la boucle j'ai inséré: NSLog(@[popClientMenu itemAtIndex:i]: %@", [popClientMenu itemAtIndex:i]);
    A priori, ça renvoie bien ce qu'il faut.

    Voici l'erreur obtenue:

    009-07-01 11:52:06.423 planning[6049:10b] *** Assertion failure in -[NSMenu itemAtIndex:], /SourceCache/AppKit/AppKit-949.46/Menus.subproj/NSMenu.m:819
    2009-07-01 11:52:06.423 planning[6049:10b] An uncaught exception was raised
    2009-07-01 11:52:06.424 planning[6049:10b] Invalid parameter not satisfying: (index >= 0) && (index < (_itemArray ? CFArrayGetCount((CFArrayRef)_itemArray) : 0))
    2009-07-01 11:52:06.424 planning[6049:10b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: (index >= 0) && (index < (_itemArray ? CFArrayGetCount((CFArrayRef)_itemArray) : 0))'
    2009-07-01 11:52:06.425 planning[6049:10b] Stack: (
        2483339435,
        2487115323,
        2483338891,
        2438696580,
        2451707209,
        19799,
        15174,
        2483398837,
        2451571690,
        2451531286,
        2451529592,
        2451528635,
        2451528441,
        2451527592,
        10924,
        10850
    )

  • CéroceCéroce Membre, Modérateur
    02:48 modifié #4
    Premières pistes:

    Déjà  vire:
    <br />NSMenu *popClientMenu = [[[NSMenu alloc] init] autorelease];<br />[/code]<br />puisque tu n&#39;utilises pas le menu que tu crées.<br /><br />Ensuite:<br />[code]<br />[popClient addItemWithTitle:[leDico valueForKey:@&quot;nom&quot;]];<br />
    


    Je dirais qu'on n'est pas sûr que [leDico valueForKey:@nom] va renvoyer une NSString: la requête peut foirer.

    <br />i=i++;<br />
    

    Plus simplement i++;



    Pas trop d'autres idées pour l'instant !
  • mpergandmpergand Membre
    02:48 modifié #5
    Vérifie que tu n'as pas deux fois le même nom de client, car il ne peut pas y avoir deux menuItem ayant le même titre, d'où le dépassement de l'index.
  • RocouRocou Membre
    02:48 modifié #6
    dans 1246443447:

    Premières pistes:

    Déjà  vire:
    <br />NSMenu *popClientMenu = [[[NSMenu alloc] init] autorelease];<br />
    


    puisque tu n'utilises pas le menu que tu crées.


    Ben si, je l'utilise afin d'initialiser le tag.

    dans 1246443447:

    Ensuite:
    Je dirais qu'on n'est pas sûr que [leDico valueForKey:@nom] va renvoyer une NSString: la requête peut foirer.


    Je vais travailler la dessus.

    dans 1246443447:

    Pas trop d'autres idées pour l'instant !

    Tant pis, merci pour le temps passé!

    Sinon, ce n'est pas une question de capacité, j'ai testé sur d'autres zones et on dépasse allègrement la limite à  laquelle je pensais.
  • mpergandmpergand Membre
    02:48 modifié #7
    Essaye ça:
    <br />- (void) initPopClient:(id)sender<br />{<br />	NSDictionary *leDico;<br />	PGSQLRecordset *rs;<br />	<br />	[popClient removeAllItems];<br />	<br />	NSString *query = @&quot;SELECT nom, id FROM clients ORDER BY nom&quot;;<br />	<br />	rs = [connection open:query];<br />	if (rs != nil) {<br />		if (![rs isEOF])<br />		{			<br />			while (![rs isEOF])<br />			{<br />				<br />				leDico=[rs dictionaryFromRecord];<br />				NSMenuItem* item=[[NSMenuItem alloc] initWithTitle:[leDico valueForKey:@&quot;nom&quot;] action:NULL keyEquivalent:@&quot;&quot;];<br />				<br />				//Association de l&#39;identifiant PostgreSQL avec le titre du PopPup (nom du client)<br />				NSString *k=[leDico valueForKey:@&quot;id&quot;];<br />				NSInteger j=[k integerValue];<br />				<br />				[item setTag:j];<br />				[[popClient menu] addItem:item];<br />				[item release];<br />				<br />				[rs moveNext];<br />			}&nbsp; &nbsp; <br />			<br />			<br />		}<br />		<br />		<br />	} else <br />	{<br />		NSLog(@&quot;Impossible de récupérer les données: %@&quot;, [connection lastError]);<br />	}<br />	[rs close];&nbsp; &nbsp; <br />}
    


    Ca ne devrait plus planter ...
  • RocouRocou Membre
    02:48 modifié #8
    dans 1246445528:

    Essaye ça:


    Ca ne devrait plus planter ...

    Effectivement, merci beaucoup.

    Visiblement, je ne maitrise pas du tout les classes NSMenu et NSMenuItem  :)
Connectez-vous ou Inscrivez-vous pour répondre.