NSTextField dynamiques par programmation

bofybofy Membre
14:02 modifié dans API AppKit #1
Bonjour

Existe-t-il un moyen de créer des TextField dynamiquement dans une page par programmation (IB est, me semble-t-il, totalement statique) ?

Quelque chose comme :
    NSTextField * field;
    [field showField:inWindow atLocation:...];

J'ai cherché, mais je n'ai pas trouvé.

Merci

Réponses

  • schlumschlum Membre
    avril 2008 modifié #2
    Bien sûr... On peut créer une interface de manière complètement dynamique...
    Mais encore faut-il ne pas le faire n'importe comment  :P

    Déjà  il faut faire un alloc/init ; ensuite, il faut lui définir toutes ses propriétés, donc "frame" et "bounds" (pour l'emplacement).
  • Philippe49Philippe49 Membre
    avril 2008 modifié #3
    dans 1208174843:

    J'ai cherché, mais je n'ai pas trouvé.

    NSTextField hérite de NSControl, et de NSView



    NSRect aFrame=NSMakeRect( ...
    NSTextField * myTextField = [[NSTextField alloc] initWithFrame:aframe];
  • bofybofy Membre
    14:02 modifié #4
    Merci

    Rien à  faire pour afficher paar programmation un textfield !
    voici mon code :
    [tt]//
    //  TSTApp.h
    //  test_06

    #import <Cocoa/Cocoa.h>

    @class ShowView;

    @interface TSTApp : NSObject {
    ShowView * showView;
    }
    -(IBAction)showView:(id)sender;
    @end

    //
    //  TSTApp.m
    //  test_06
    #import "ShowView.h"
    #import "TSTApp.h"

    @implementation TSTApp {
    }
    - (IBAction) showView:(id)sender {
    showView = [[ShowView alloc] initWithWindowNibName:@ShowView];
    [showView showWindow:self];
    }

    @end

    //
    //  ShowView.h
    //  test_06

    #import <Cocoa/Cocoa.h>

    @interface ShowView : NSWindowController {

    }

    @end

    //
    //  ShowView.m
    //  test_06

    #import "ShowView.h"

    @implementation ShowView
    - (void) awakeFromNib {
    NSRect aFrame = NSMakeRect(10,10,10,10);
    NSTextField * myTextField = [[NSTextField alloc] initWithFrame:aFrame];
    // [aFrame setBackgroundColor:(NSColor *)redColor] [myTextField setBackgroundColor:(NSColor *)redColor];
    [myTextField display];
    }

    @end[/tt]


    Où est l'erreur ? Bête comme d'habitude...[tt][/tt]
  • schlumschlum Membre
    14:02 modifié #5
    Je me trompe peut-être, mais je ne vois pas le code où tu ajouterais ton NSTextField à  une vue...  ???
    Je pense que le programme ne va pas deviner tout seul sur quelle fenêtre / sous-vue le mettre  :P

    Si c'est pour mettre dans une fenêtre directement -> voir "- (id)contentView" de NSWindow
    Pour ajouter à  une vue -> "- (void)addSubview:(NSView *)aView" de NSView
  • bofybofy Membre
    14:02 modifié #6
    Alors, si je devine bien, pour afficher un truc dans une fenêtre, il faut créer la fenêtre, une vue (avec NSView ?) dans la fenêtre, une frame dans la view et et enfin un objet (TextField ou autre) dans la frame ? Pourquoi pas ?

    Mais j'aimerais savoir où on peut trouver cette sorte de documentation, qui ne fasse pas appel à  IB ?
  • Philippe49Philippe49 Membre
    14:02 modifié #7
    dans 1208441175:

    Alors, si je devine bien, pour afficher un truc dans une fenêtre, il faut créer la fenêtre, une vue (avec NSView ?) dans la fenêtre, une frame dans la view et et enfin un objet (TextField ou autre) dans la frame ? Pourquoi pas ?

    Mais j'aimerais savoir où on peut trouver cette sorte de documentation, qui ne fasse pas appel à  IB ?


    Meuh non ...   ;)

    Tu mets un IBOutlet
    Code : IBOutlet NSView * contentView;
    connecté dans IB sur la contentView de ta fenêtre

    puis tu utilises les méthodes données par Schlum
  • schlumschlum Membre
    14:02 modifié #8
    Pas obligé d'utiliser un IBOutlet d'ailleurs ; si on veut récupérer la contentView d'une fenêtre de n'importe quelle autre vue, il y a aussi la méthode "- (NSWindow *)window" de NSView...
  • bofybofy Membre
    14:02 modifié #9
    Merci tous les deux Schlum et Philippe49

    Tout cela vous paraà®t évident, mais qu'est-ce qui cloche dans mon code ?

    Sachant que je ne veux pas utiliser IB ! (En utilisant IB je ne comprend rien à  ce que je fais...)
  • Philippe49Philippe49 Membre
    14:02 modifié #10
    Ci-joint
  • schlumschlum Membre
    14:02 modifié #11
    dans 1208441175:

    Alors, si je devine bien, pour afficher un truc dans une fenêtre, il faut créer la fenêtre, une vue (avec NSView ?) dans la fenêtre, une frame dans la view et et enfin un objet (TextField ou autre) dans la frame ? Pourquoi pas ?

    Mais j'aimerais savoir où on peut trouver cette sorte de documentation, qui ne fasse pas appel à  IB ?


    La fenêtre, c'est un minimum... Tu ne peux rien afficher sans fenêtre.

    Une fois que tu as la fenêtre, tu obtiens la "contentView" avec la méthode adéquate que j'ai donnée ci-dessus, et tu fais juste "addSubview" avec ta vue dessus. Je ne comprends pas le problème.  ???
  • bofybofy Membre
    14:02 modifié #12
    Le code de Philippe49 marche très bien au niveau 0.

    Mais je veux un peu plus et que ça fonctionne au niveau 1, et je n'y arrive pas.

    J'ai dans la mainwindow (niveau 0) un bouton, qui me permet d'ouvrir une fenêtre (niveau 1).
    Je sais faire :
    showView = [[ShowView alloc] initWithWindowNibName:@ShowView];
    [showView showWindow:self];
    Ca marche si 
            @interface ShowView : NSWindowController
    Si je mets (et le reste du code de Philippe49)
          @interface ShowView : NSObject
    rien ne s'affiche, et NSLog ne fournit aucune information.

    Ma question est toujours la même : comment créer dynamiquement une interface dans une fenêtre appelée par une autre ?

    ???

    NB pour schlum : si tu ne comprends pas le problème, un code comme celui de Philippe49 me permettrais peut-être de débloquer la situation...
  • Philippe49Philippe49 Membre
    avril 2008 modifié #13
    dans 1208610563:

    Le code de Philippe49 marche très bien au niveau 0.

    Mais je veux un peu plus et que ça fonctionne au niveau 1, et je n'y arrive pas.

    Je veux bien essayer d'atteindre le niveau 1  ::)

    dans 1208610563:

    J'ai dans la mainwindow (niveau 0) un bouton, qui me permet d'ouvrir une fenêtre (niveau 1).
    Je sais faire :
    showView = [[ShowView alloc] initWithWindowNibName:@ShowView];
    [showView showWindow:self];
    Ca marche si 
            @interface ShowView : NSWindowController

    Ce code doit être dans un contrôleur de l'application (voir plus loin)  mais ok  

    Appeler ShowView un WindowController prête complètement à  confusion, et montre comme ne l'as pas dit Schlum (... ;)) que tu n'as pas un schéma clair en tête.
    Je préfèrerais par exemple ShowWindowController
    Il y a en présence :
    • Un Contrôleur, que tu appelles pour l'instant ShowView= ShowWindowController, qui gères l'ouverture de la fenêtre, et ce qui s'y passe
    • Une fenêtre, qui doit se trouver dans un second Nib, dont le FileOwner's est de la classe ShowWindowController.
      Le plus simple, c'est que cela soit un IBOutlet de la classe ShowWindowController, connecté dans IB (File Owner's --> Window
    • Dans cette fenêtre, une vue principale = a view  que l'on atteint par NSView * contentView=[window contentView]
    • Des vues NSArray * views=[contentView subviews] contenues dans cette contentView dont le fameux NSTextField que tu rajoutes par exemple dans le awakeFromNib de ShowWindowController 


    dans 1208610563:

    Si je mets (et le reste du code de Philippe49)
           @interface ShowView : NSObject
    rien ne s'affiche, et NSLog ne fournit aucune information.


    Ben forcément.  >:D :fouf):



    Maintenant le fameux bouton qui déclenche l'ouverture de ta seconde fenêtre doit être connecté à  une IBAction d'un contrôleur instancié dans MainMenu.nib

    @class ShowWindowController;
    #interface Controller : NSObject
    {
      ShowWindowController * showWC; 
    }

    -(IBAction) openShowWindow:(id) sender;
    @end
  • Philippe49Philippe49 Membre
    14:02 modifié #14
    Un peu de lecture sur Interface Builder

    Introduction to Interface Builder User Guide
  • bofybofy Membre
    14:02 modifié #15
    [terminé pour moi]
    merci à  tous
Connectez-vous ou Inscrivez-vous pour répondre.