NSTextField programmatisch erzeugen und platzieren

Zettt

Doppelter Melonenapfel
Registriert
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
 

the x-master

Riesenboiken
Registriert
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.
 
  • Like
Reaktionen: Zettt

Zettt

Doppelter Melonenapfel
Registriert
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.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Code:
[myTextField removeFromSuperview];

MacApple

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

Zettt

Doppelter Melonenapfel
Registriert
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. :-[
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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?
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?
 

Zettt

Doppelter Melonenapfel
Registriert
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:
Oh Bitte hab doch Nachsicht mit einem Programmier-Noob. :-[

Hast du vielleicht einen Link wo ich mehr Infos bekomme?
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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.
 

Zettt

Doppelter Melonenapfel
Registriert
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.
 

Zettt

Doppelter Melonenapfel
Registriert
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)
 

Poljpocket

Salvatico di Campascio
Registriert
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
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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
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.
 

Zettt

Doppelter Melonenapfel
Registriert
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. ;)
 
Zuletzt bearbeitet:

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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.
 

Zettt

Doppelter Melonenapfel
Registriert
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
 

Zettt

Doppelter Melonenapfel
Registriert
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?
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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!