2010-11-21 3 views
0

Ich bin nur nicht das bekommen, möchte ich in meiner app eine Ansicht angezeigt werden, wenn ein Benutzer auf eine Schaltfläche klickt.Objective-C kann jemand erklären, wie programmatisch eine Ansicht anzuzeigen

Ich habe so weit gekommen:

NSView* unitMarker = [[NSView alloc] initWithFrame: NSMakeRect(20.0, 20.0, 80.0, 50.0) ]; 

Wie würde ich diese Ansicht angezeigt werden mit einem roten Hintergrund?

Dank

+4

Kaufen Sie ein Buch und lernen Sie die Grundlagen. Sie werden diese Route nirgends finden. –

Antwort

0

Sie müssen NSView Unterklasse und drawRect: zu implementieren.

In diesem Fall Sie gehen nur die gesamte rect mit Rot zu füllen.

@interface MyView : NSView { 
} 
@end 


@implementation MyView 

-(void)drawRect:(NSRect)dirtyRect { 
    [[NSColor redColor] set]; 
    NSRectFill(dirtyRect); 
} 

@end 

, dass ein extrem einfaches Beispiel ist das tut, was Sie wollen, aber wenn Sie komplexere Dinge (Hinzufügen von Rahmen (Schlaganfall) oder zeichnen Kurven (Pfade), etc.) tun wollen, dann müssen Sie alle um die Zeichnung lernen Klassen verfügbar für Sie.

Scott Stevenson hat einige einfache schriftliche Anleitungen zu diesem Thema folgen:

http://cocoadevcentral.com/d/intro_to_quartz/ und; http://cocoadevcentral.com/d/intro_to_quartz_two/

1

@Aaron: Er sagt, er will dies programmgesteuert tun. Außerdem benutzt er NSView, nicht UIView, daher wäre ein iPhone-Tutorial fast irrelevant.

@ Mike: Ihre Beschreibung dessen, was Sie tun möchten, ein bisschen vage. Wir haben ein bisschen Code-Erstellung, eine Ansicht, aber keinen Kontext, um uns genau zu sagen, was Sie zu tun versuchen. Möchten Sie, dass die Ansicht in einem neuen Fenster oder dem selben Fenster angezeigt wird? Möchten Sie eine bereits vorhandene Ansicht ersetzen? Wir kennen nicht einmal dein Können.

Ich schlage vor, gehen Sie in der Dokumentation zu NSView Check-out: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

+0

Nur für zukünftige Referenz, sollte diese Art von Antwort ein Kommentar sein, keine Antwort;) (Die Kommentare, die Sie an die anderen Benutzer, ich meine, nicht den Link) – d11wtq

+0

Verstanden, tut mir leid, ich bin ein Neuling hier. –

1

dies immer wieder laut 10mal sagen aus:

Interface Builder ist mein Freund.

konnte ich genau das, zusammen ein Beispielprojekt, das, was Sie in ca. 5 Minuten tun, wollen von Interface Builder als Teil des Prozesses nutzen. http://www.markdouma.com/developer/ShowWindowWithRedView.zip.

Sie können eine Ansicht nicht anzeigen, ohne sie zuerst in einem Fenster zu platzieren. Bei weitem der einfachste Weg, um so etwas zu machen, ist ein zweites Fenster in Interface Builder zu ziehen, es beim Start nicht sichtbar zu machen, eine generische NSView benutzerdefinierte Ansicht auf das Fenster zu ziehen, seine Klasse auf SRRedView (Ihre rote Sichtunterklasse). Wie von d11wtq gepostet, überschreiben Sie die primitive Zeichnungsmethode von NSView, wie er zeigt (obwohl ich persönlich NSBezierPath :-P bevorzuge).

In Ihrem Controller-Klasse definieren Sie IBOutlets, und solche, bis dann im Interface Builder Haken. Diese bieten Ihnen eine Möglichkeit, die wichtigen Teile Ihrer Schnittstelle zu referenzieren, so dass Sie sie programmgesteuert bearbeiten können.

I hinzugefügt eine IBAction Methode, die die Taste im Hauptfenster zu nennen, ist angeschlossen.Diese Methode sagt einfach dem zweiten Fenster, dass es sich selbst zeigt.

- (IBAction)showWindowWithRedView:(id)sender { 
    [windowWithRedView makeKeyAndOrderFront:nil]; 
} 

In den 8 Jahren oder mehr, dass ich Cocoa Programmierung getan, ich glaube nicht, dass ich jemals manuell Fenster und Ansichten zu greifen habe erforderlich zu schaffen. Es war schon immer viel schneller, einfach eine andere Nib-Datei zu laden, die die Fenster oder Ansichten enthält, die ich anzeigen muss. Die Verwendung von Interface Builder zusammen mit Xcode zum Erstellen Ihrer App unterscheidet sich ein wenig von der Funktionsweise anderer IDEs. (Insbesondere wenn Sie Elemente in Interface Builder anordnen, erzeugen Sie nicht so viel Code wie Instanzen von UI-Objekten und "fixieren" sie dann in ihrer aktuellen Anordnung in eine .nib-Archivdatei. Wenn Sie die App starten Sie werden wieder zum Leben erweckt, oder zumindest denke ich darüber nach.

+2

Zum Thema 'NSRectFill' vs. NSBezierPath: NSBezierPath ist flexibler, aber auch mehr Tipparbeit, wenn Sie nur ein Rechteck füllen möchten. 'NSRectFill' ist auch standardmäßig wesentlich schneller, da es' NSCompositeCopy' standardmäßig verwendet, während NSBezierPath die Compositing-Operation des Kontexts verwendet, die standardmäßig 'NSCompositeSourceOver' ist. Es ist möglich, beide zu ändern, so dass sie gleich schnell sind, aber das ist noch mehr tippen; Auf der anderen Seite, manchmal brauchen Sie wirklich 'SourceOver'. –

1

Ich habe so weit gekommen:

NSView* unitMarker = [[NSView alloc] initWithFrame: NSMakeRect(20.0, 20.0, 80.0, 50.0) ]; 

Wie würde ich mit einem roten Hintergrund dieser Ansicht angezeigt werden?

Sie würden nicht, weil ein einfaches NSView nichts zeichnet.

Zuerst müssen Sie NSView ableiten, drawRect: in dieser Unterklasse implementieren, um ihre Grenzen mit rot zu füllen, und diese Unterklasse anstelle von NSView direkt instanziieren.

Sie sollten die View Programming Guide lesen.

Wie würde ich diese Ansicht anzuzeigen ...

würden Sie nicht. Die Ansicht wird angezeigt, wenn dies sinnvoll ist.

Es wird niemals angemessen sein, sich bis Sie selbst zu zeichnen add it to a view hierarchy. Jedes Fenster hat einen, der auf seiner Inhaltsansicht basiert. Sie müssen diese Ansicht entweder zu einer Inhaltsansicht oder zu einer untergeordneten Ansicht (Unteransicht, Unteransicht einer Unteransicht usw.) einer Inhaltsansicht hinzufügen.

Normalerweise sollten Sie keine Ansicht von Ihrem Controller anzeigen lassen. Das ist die Aufgabe des Fensters. Wenn Sie eine Eigenschaft oder Eigenschaften der Ansicht ändern, die sich auf die Zeichnung auswirken, set the view as needing display, und lassen Sie das Fenster angeben, dass die Ansicht angezeigt werden soll, wenn dies sinnvoll ist.

+1

Ausgezeichneter Punkt über das Aktiv-vs.-Passiv-Paradigma. Ich vergaß, das ist eine andere Sache, die Leute, die Kakao neu kennen, tun wollen, einen Ansatz zu aktiv zu machen. "Wie zeige ich diese Ansicht an?", "Wie lege ich 4 Zeilen in die Tabellenansicht", etc. Es ist genau umgekehrt. – NSGod

Verwandte Themen