1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

NSTextField programmatisch erzeugen und platzieren

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Zettt, 22.07.08.

  1. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Hi,

    Der zweite neue Thread heute! :p

    Und zwar schreibe ich gerade die 2.0 meiner "Schmarrn"-App Randomator.

    Ich wuerde dem User gerne anbieten, mehr Eingabemoeglichkeiten zu haben und das wahlweise per Button.
    Ein Klick auf "+" macht also a) den View groesser und b) ein neues Textfeld hinzu. (Genauso umgekehrt mit "-")

    Den View vergroessern hab ich.
    Aber wie fuege ich ein NSTextField neu hinzu? Und zwar genau an Stelle x,y?

    Danke
     
  2. the x-master

    the x-master Riesenboiken

    Dabei seit:
    29.01.06
    Beiträge:
    290
    Moin,

    wenn das ganze in Objective-C geschehen soll, so:

    NSTextField *myTextField = [[NSTextField alloc] initWithFrame:NSMakeRect: (x,y,width,height)];
    [[myWindow contentView] addSubview:myTextField];

    Oder wenn's ein View ist, dann gleich [myView addSubview:myTextField];

    Wenn du's nicht mehr brauchst, das [myTextField release]; nicht vergessen.

    Hope this helps.

    Grüße,
    X.
     
    Zettt gefällt das.
  3. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Dankeeee
    Soweit war ich schon aber den Rest hier...
    ...wusste ich nicht.

    Werde ich gleich mal ausprobieren.

    EDIT:
    Geil das geht ja einfach! Merci nochmal.
     
  4. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Hmm...hast du vielleicht auch noch eine Idee was das Entfernen betrifft?

    Das Problem uebersteigt gerade meinen Horizont.
     
  5. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Code:
    [myTextField removeFromSuperview];
    MacApple

    PS. Es gibt auch eine Dokumentation zu dem ganzen Kram. ;)
     
  6. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Das ist mir schon klar. ;)

    Aber wenn du den Ausgangspost gelesen haettest wuesstest du, dass ich per + was hinzufuege und per - weg machen moechte. Und das krieg ich grade nicht hin.

    Oh Bitte hab doch Nachsicht mit einem Programmier-Noob. :-[
     
  7. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    man macht gleich bei der Erzeugung ein -autorelease oder meinetwegen nach dem addSubview: ein -release.

    Views retainen ihre Kinder.
     
  8. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Wenn du es nur unter Leopard, dafür aber "richtig" machen willst, würde ich das Textfeld in einen Nib stopfen und den bei jedem Hinzufügen laden. Dann kannst du auch gleich die ganzen Einstellungen im Interface Builder machen, inkl. Bindings (View-Controller).

    Das Hinzufügen machst du dann wie bereits erwähnt mit -addSubview:.

    BTW: Was hindert dich an einem Tableview mit einer Spalte und ohne Kopfzeile?
     
  9. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Danke Amin, wie du weisst bin ich immer sehr erfreut deine Antworten zu lesen. Aaaaber:

    Erstens: What??? o_O
    und
    Zweitens:
    Hast du vielleicht einen Link wo ich mehr Infos bekomme?
     
  10. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Na ja, nicht in drei oder vier Zeilen. Ich versuche es mal kurz:

    Du willst ja immer neue Views haben. Dann liegt es nahe, den View als Vorlage in einen Nib zustecken. Wenn du eine neue Instanz benötigst, dann lädst du einfach den Nib.

    Bisher war das etwas frickelig. Seit Leopard existiert aber ein View-Controller, der im Prinzip so funktioniert wie ein Window-Controller. Mit dem kannst du beliebig häufig den View (eigentlich:den Nib) laden. Hast du das getan, dann fügst du diesen View nur noch ein. Mutmaßlich benötigst du nicht einmal einen VC, dazu müsste ich aber mehr wissen.

    Die andere Lösungsidee basiert darauf, dass du mehrere Views ja über ein Tableview mit seinen Zeilen "simulieren" kannst. Gerade, wenn die Views gleichartig sind, ist das häufig einfach billig,schnell & einfach.
     
  11. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Ich raff's nicht. Seit den Antworten hier fummel ich rum und waelz die Dokumentation. Aber ich krieg es einfach nicht hin.

    Ich trau mich ja kaum mehr zu fragen.

    Erstmal hatte ich mich fuer die addSubview Methode vom x-master versucht. Aber wie kommt man da jetzt an die einzelnen neuen Textfelder ran. Das ist mir ein totales Raetsel.

    Wonach sucht man denn da in der Doku? Auch per Google kriegt man keine Ergebnisse.

    Nib laden, View laden? Erzeugt bei mir kraeftige Fragezeichen.
     
  12. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Schau dir mal in diesem Projekt die Methode -addSubview in MyDocument an.
     
  13. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Danke.

    Jetzt versteh ich das erst. Die Loesung per Nib ist deshalb so elegant, weil das Textfeld im Interface Builder erstellt und da halt schoen zusammengeklickt werden kann.
    Ohne Rechnerei mit Groessenbestimmung fuer das Textfeld.

    Und man spaeter das Textfeld so oft reinladen kann wie man eben moechte.
    Wenn man im Interface Builder das Textfeld einmal aendert, wird auch schoen fuer alle Instanzen, die zur Laufzeit erstellt werden, die Groesse geaendert. (Fast so schoen wie ein mit CSS formatierter Text quasi)
     
  14. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Hast du schon einmal von dem NSRuleEditor gehört? Ich glaube, der macht genau das, was du versuchst, selber zu erstellen!

    Zum Anschauen: Mach mal mit Spotlight in einem Finder-Fenster über das '+' mehrere Optionen... so sieht ein Rule Editor aus!

    Für mehr Informationen: Xcode -> "Help"-Menu -> Documentation -> Im Suchfeld "NSRuleEditor" eingeben! Gibts auch online, bin aber zu faul, um die Seite rauszusuchen :D

    Ich weiß nicht, wie man den bedient, hab ihn selber noch nie gebraucht...

    Grz. ppocket
     
  15. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Wie bereits erwähnt macht das jedes Tableview, sogar schöner, weil mit Cells anstelle von Views. Aber aus irgendeinem Grunde benötigt er das anders.
     
  16. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Das geht nicht um benötigen oder nicht. Sondern das ich's halt so machen möchte, weil ich keinen anderen weg KENNE.

    Das war mir das nächste. Mit TableView und Cell und bla...weiss ich nicht was ihr von mir wollt.

    EDIT: Hab's jetzt einfach mal probiert und mich durchgequaelt. Geht einfacher als gedacht.
    Jetzt bin ich gerade drueber das was in einer bestimmten Zeile steht abzufragen. Aber das werde ich jetzt wohl auch noch irgendwie hinkriegen.

    Erstmal danke. Und sorry fuer's nicht-hoeren-wollen. ;)
     
    #16 Zettt, 06.08.08
    Zuletzt bearbeitet: 06.08.08
  17. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Nicht schlimm, ganz im Gegenteil: Jetzt hast du gleich was zu dynamisch ladbaren Views gehört. Ich kenne Leute, die seit Jahren mit Cocoa programmieren und diese Möglichkeit nicht nutzen. Deren Nibs sehen aus wie ein Hochregallager für Views.

    Und jetzt lernst du gleich den Umgang mit Tableviews. Auch gut.

    Frag nur weiter, niemand ist dir böse.
     
  18. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Na dann bin ich einfach mal, ungeniert, glücklich darüber, dass ichs gestern ohne nachschauen im Buch/Manual/Web zusammengebracht habe! :p
     
  19. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Ich gebe auf. Seit knapp einer Woche probiere ich jetzt abends immer ein bisschen herum aber ich komme leider nicht ans Ziel.
    Natürlich habe ich auch ein paar schwerwiegende Fehler gemacht, weshalb das am Anfang auch gar nicht funktioniert hat -- mit dem Table View.

    Was ich alles gemacht habe. Ich habe mir eine Klasse erzeugt und in dieser eine (Instanz-?)Variable angelegt - ein String. Im Interface Builder hab ich dann ein neues Objekt reingezogen und diesem die Klasse zugeordnet. Nicht in den Attributes sondern dem anderen Tab...dort wo man auch die vorhandenen Outlets und Actions sieht. Kann gerade nicht nachsehen.

    Dann einen TableView und einen Array Controller erzeugt. Der Controller hat in den Attributes bei Class meine in Xcode erzeugte Klasse stehen.

    Der TableView hat bei seinem content-Binding bei "bind to" den Controller stehen und als Key Path hab ich wieder den Variablen-Namen angegeben.

    Jetzt versuche ich per Outlet und einem anderen Objekt mit dem TableView zu kommunizieren und habe mir ein Outlet
    Code:
    IBOutlet NSTableView *tableView; 
    angelegt. Wenn ein Button geklickt wird wird sowas hier ausgeführt:
    Code:
    NSArray *array = [tableView managedObjects];
    Es funktioniert auch mir im Log meinetwegen den count des array's auszugeben. Nur beim Zugriff per:
    Code:
    [array objectAtIndex:0];
    Bekomme ich irgendwelchen Zeichensalat im Log angezeigt. Grundsätzlich mal bin ich doch nicht falsch dran oder?
     
  20. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Mir scheint, dass du da in der tat einen Designfehler bezüglich MVC drin hast. Jetzt ist es aber zu spät. Wartest du bis Morgen?

    UND NICHT AUFGEBEN!
     

Diese Seite empfehlen