NSTextField et multi-ligne

clampinclampin Membre
13:41 modifié dans API AppKit #1
Salut,

J'avais fait en Realbasic une petite application qui ouvre une image par un open panel et la met dans une vue et le chemin de l'image s'affichait dans un champ. Si j'ouvrait une nouvelle image, alors le nouveau chemin était ajouté en dessous du chemin de l'image précédente dans le champ.

J'essaie donc de reproduire cette application en Cocoa (Tiger).

J'ai donc ma NSImageView qui affiche sans problème les images, mais le texte de mon NSTextField change. le chemin de mon image est remplacé par le nouveau.

Ma question est comment faire pour qu'il ajoute une ligne a mon NSTextField.

Voici le code d'ouverture de mon image

<br /><br />/* GUIControl.h */<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface GUIControl : NSObject<br />{<br />&nbsp; &nbsp; IBOutlet NSWindow *MyWindow;<br />&nbsp; &nbsp; IBOutlet NSImageView *ViewImage;<br />	IBOutlet NSTextField *archiveUrlField;<br />}<br />- (IBAction)openFile:(id)sender;<br />@end<br />


<br />#import &quot;GUIControl.h&quot;<br />#define MAX_WIDTH 800<br />#define MAX_HEIGHT 600<br /><br />@implementation GUIControl<br /><br />- (IBAction)openFile:(id)sender<br />{<br />	//&quot;Standard&quot; open file panel<br />	NSArray *fileTypes = [NSArray arrayWithObjects:@&quot;jpg&quot;,@&quot;gif&quot;,@&quot;png&quot;, @&quot;psd&quot;,@&quot;tga&quot;,@&quot;jpeg&quot;, nil];<br />	<br />	int i;<br />	//create the file open Panel class<br />	NSOpenPanel* oPanel = [NSOpenPanel openPanel];<br />	<br />	[oPanel setCanChooseDirectories:NO];<br />	[oPanel setCanChooseFiles:YES];<br />	[oPanel setCanCreateDirectories:YES];<br />	[oPanel setAllowsMultipleSelection:NO];<br />	[oPanel setAlphaValue:0.95];<br />	[oPanel setTitle:@&quot;Select a file to open...&quot;];<br />	<br />	// Display the dialog. If OK button was pressed,<br />	// process the files.<br />	if ([oPanel runModalForDirectory:nil file:nil types:fileTypes] == NSOKButton )<br />		{<br />			// Get an array containing the full filenames of all<br />			// files and directory selected.<br />		NSArray* files = [oPanel filenames];<br />			<br />			//Loop through all the file and process them<br />		for( i = 0; i &lt; [files count]; i++ )<br />			{<br />			NSString* fileName = [files objectAtIndex:i];<br />			[MyWindow setTitle:fileName];<br />			[archiveUrlField setStringValue:fileName]; /* What method use for adding filenames whitout erase filenane ? */<br />			<br />			<br />			NSImage *imageFromBundle = [[NSImage alloc] initWithContentsOfFile:fileName];<br />			<br />			if(imageFromBundle!=nil)<br />				{<br />					if ([ViewImage image]!=nil)<br />						[[ViewImage image] release];<br />				[ViewImage setImage: imageFromBundle];<br />				<br />				NSRect frame = [MyWindow frame];<br />				frame.size = [imageFromBundle size];<br />				if(frame.size.width &gt;= MAX_WIDTH)<br />					frame.size.width = MAX_WIDTH;<br />				if(frame.size.height &gt;= MAX_HEIGHT)<br />					frame.size.height = MAX_HEIGHT;<br />				<br />				frame.size.width += 80;<br />				frame.size.height += 150;<br />				<br />				[MyWindow setFrame:frame display:YES animate:YES];<br />				}<br />			}<br />		}<br />}<br /><br />@end<br /><br />

Réponses

  • NseaProtectorNseaProtector Membre
    13:41 modifié #2
    NSString* fileName = [files objectAtIndex:i];

    Tu devrais remplir ton champ texte après ta boucle parce qu'a chaque itération tu remplaces ton texte, enfin je crois que c'est ça.
  • AliGatorAliGator Membre, Modérateur
    13:41 modifié #3
    Alors pas tout à  fait... car s'il utilisait la méthode que justement il recherche, qui ajoute le texte au champ au lieu de le remplacer, ben il ajouterait le chemin de chaque fichier sélectionné (si on a choisi plusieurs fichiers dans l'openPanel) dans le NSTextField donc ça ferait ce qu'il veut.

    La question est donc ce qu'il a mis en commentaire, autrement dit comment ajouter le texte au NSTextField au lieu de remplacer le contenu.
    La réponse est que tu ne peux pas directement : NSTextField ne peux que changer sa valeur, pas ajouter une nouvelle valeur.
    La solution est simple, tu prends la valeur actuelle, tu rajoutes ton texte, et tu met cette nouvelle valeur dans ton NSTextField ;)
    [tt][archiveUrlField setStringValue: archiveUrlField stringValue] stringByAppendingString:fileName;[/tt]

    Bon le truc c'est que ça va pas te rajouter le retour chariot, donc tu peux faire (en décomposant c'est même plus clair) :
    NSString* newVal = [NSString stringWithFormat:@&quot;%@%@&#092;n&quot;, [archiveUrlField stringValue], fileName];<br />[archiveUrlField setStringValue: newVal];
    


    Mais bon le plus propre ça aurait été de faire une NSTableView (comme une ListBox en RB si tu veux) qui t'affiche ta liste de chemins, un par ligne de ta TableView. Bon ok les TableView c'est un peu déroutant au début quand on commence Cocoa et qu'on n'en a jamais fait, mais ton cas d'utilisation ici serait un très bon exemple pour apprendre justement ;) L'idée serait alors de stocker ta liste de chemins dans un tableau (NSMutableArray contenant tes NSStrings), et d'associer simplement ce tableau à  ta NSTableView (juste 2 méthodes du NSTableView, voir cette page pour la doc, juste les méthodes "Getting Values" suffisent et sont dans ce cas super simples, tenant en une ligne)
  • clampinclampin Membre
    13:41 modifié #4
    Bonjour,

    dans 1222182380:

    Alors pas tout à  fait... car s'il utilisait la méthode que justement il recherche, qui ajoute le texte au champ au lieu de le remplacer, ben il ajouterait le chemin de chaque fichier sélectionné (si on a choisi plusieurs fichiers dans l'openPanel) dans le NSTextField donc ça ferait ce qu'il veut.

    La question est donc ce qu'il a mis en commentaire, autrement dit comment ajouter le texte au NSTextField au lieu de remplacer le contenu.
    La réponse est que tu ne peux pas directement : NSTextField ne peux que changer sa valeur, pas ajouter une nouvelle valeur.
    La solution est simple, tu prends la valeur actuelle, tu rajoutes ton texte, et tu met cette nouvelle valeur dans ton NSTextField ;)
    [tt][archiveUrlField setStringValue: archiveUrlField stringValue] stringByAppendingString:fileName;[/tt]


    Bon le truc c'est que ça va pas te rajouter le retour chariot, donc tu peux faire (en décomposant c'est même plus clair) :
    NSString* newVal = [NSString stringWithFormat:@&quot;%@%@&#092;n&quot;, [archiveUrlField stringValue], fileName];<br />[archiveUrlField setStringValue: newVal];
    



    OK j'ai implémenté ça et ça fonctionne Merci Aligator....


    dans 1222182380:

    Mais bon le plus propre ça aurait été de faire une NSTableView (comme une ListBox en RB si tu veux) qui t'affiche ta liste de chemins, un par ligne de ta TableView. Bon ok les TableView c'est un peu déroutant au début quand on commence Cocoa et qu'on n'en a jamais fait, mais ton cas d'utilisation ici serait un très bon exemple pour apprendre justement ;) L'idée serait alors de stocker ta liste de chemins dans un tableau (NSMutableArray contenant tes NSStrings), et d'associer simplement ce tableau à  ta NSTableView (juste 2 méthodes du NSTableView, voir cette page pour la doc, juste les méthodes "Getting Values" suffisent et sont dans ce cas super simples, tenant en une ligne)


    Je vais regarder ça de plus prêt.. je reviendrais si j'ai des questions.
Connectez-vous ou Inscrivez-vous pour répondre.