• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Sheet unmittelbar nachdem das Document-Fenster erscheint

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Hallo hier schon mein 2tes Problem:

Ich möchte in einer Document - Based Cocoa Application unmittelbar nachdem das Document Fenster erschienen ist, ein Sheet einlaufen lassen (Mit eigenem Window-Controller und Nib file).

Wenn ich aber den Anzeigebefehl in die Methode
Code:
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
einfüge, kommt das zu Darstellungsproblemen und sieht dann ca. so aus:

ScreenShot

Nochmals vielen Dank für eure Ideen

Poljp.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Code:
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
    [super windowControllerDidLoadNib:aController];
	[[[[self windowControllers] objectAtIndex:0] window] center];
	
	[removePersonButton setEnabled:NO];
	[removeBillButton setEnabled:NO];
	[printChoiceButton setEnabled:NO];
	
	[noSelectionAlertBox setHidden:NO];
	
	if	([userInfo count] == 0)
	{
		userInfoWindowController *controller = [[userInfoWindowController alloc] initWithDocument:self];
		[controller showWindow:nil];
	}
}

Der Code innerhalb der Schleife if ([userInfo count] == 0) {}

die initWithDocument: Methode braucht der Controller, damit er weiss, an welches Fenster er das Sheer anhängen muss und an welches Objekt er die Daten schicken muss (Dies wäre auch mit Notifications möglich).

Die Methode showWindow: habe ich überschrieben! Da wird dann gleich das Sheeting erzeugt, am [document windowForSheet] Fenster.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Das was ich genau meine, passiert zum Beispiel bei Apple's Pages App (Auswahl des Designs...).
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Sorry hab dich falsch verstanden :)

Code:
- (void)showWindow:(id)sender
{
	[NSApp beginSheet:[self window] 
           modalForWindow:[document windowForSheet]
           modalDelegate:self 
           didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) 
           contextInfo:nil];
}
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Also, so ganz verstehe ich das noch nicht.

Du lädst offenkundig einen Nib, der das Sheet enthält. Richtig?
Der Window-Controller dafür müsste doch bereits sein Dokument kennen. Wieso tut er das nicht und du machst da selbst etwas?

Du kannst ja mal versuchen, die Operation später auszuführen. Dazu einfach ins Hauptfenster einen Button platzieren und an eine Action legen. Dann kannst du beliebig das Sheet öffnen. Passiert es dann auch?
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Ich hab noch 2 andere Windowcontrollers mit genau dem selben System, da funktionierts ohne Probleme. Das Problem scheint nur der Zeitpunkt, in welchem diese Methode aufgerufen wird, zu sein. Wahrscheinlich ist in dem Fall das Dokumentfenster selbst noch gar nicht richtig fertig geladen und angezeigt.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Der Windowcontroller des Dokuments selbst kennt sein Dokument, das ist mir schon klar. Aber ein anderer, der eigentlich mit dem Dokument gar nichts zu tun hat, kennt doch das Dokument nicht oder? die document variable wird durch das initwithdocument: festgelegt, nicht von selbst!

Vielleicht noch das damit es klar ist: Die initWithDocument: methode
Code:
- (id)initWithDocument:(MyDocument *)doc
{
	self = [super initWithWindowNibName:@"userInfoNib"];

	if (self != nil)
	{
		document = doc;
	}
	
	return self;
}
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Die Dokument-Variable wird festgelegt, wenn du -addWindowController (NSDcoument) vresendest. Ist dann bereits die Eigenschaft gesetzt, so wird der Window-Controller nicht dem Dokument hinzugefügt. (Rodewig/Negm-Awad, Objective-C und Cocoa, S. 548, erster Kasten)

Ich kann wirklich deinem Code nicht ganz folgen. Wieso machst du es nicht einfach so, wie vorgesehen, also im Document die Window-Controller erzeugen und hinzufügen.

Dass es zu einem späteren Zeitpunkt zu funktionieren scheint, wäre mir zu wenig, wenn ich auf Fehlersuche bin. Überprüfe es doch einmal. Dann wäre der Punkt schon einmal abgehackt.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Kennst du eine Delegate Methode die später aufgerufen wird, als die, windowControllerDidLoadNib: Methode?

Das ist ja der Ablauf, der durchgegangen wird, wenn ein Dokument geladen wird:

• Daten laden:
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
• Window - Controller erstellen
• windowControllerDidLoadNib:
<--- und ich suche eine Delegate - Methode, die nachdem das Dokumentfenster angezeigt worden war noch aufgerufen wird, wenn ich meine Schleife dann dort einsetze, gehe ich mal davon aus, dass das ganze funktioniert...

Vielleicht eine, die das Dokument-Fenster selbst sendet, so im Stil "ich-bin-jetzt-sichtbar".

Und ich will den Controller nicht den Dokument - Windowcontrollern hinzufügen, was eigentlich auch eine Option wäre, aber ich habe es bis jetzt mit meinen Sheets immer mit dem obigen System gelöst, es hat immer funktioniert, nur habe ich noch nie zu genau dem Zeitpunkt ein Sheet einlaufen lassen. Ich habe ja weiter oben geschrieben, der Zeitpunkt sei eindeutig das Problem.

Noch zu deinen letzten Zeilen: Die 'document' - Variable in meinem Fall ist eine instanzvariable meiner Subklasse, nicht eine der NSWindowController - Klasse selbst.
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Perfekt! ich habe meine Schleife einfach in die makeWindowControllers geschoben, den controller dann nicht angefordert sein Fenster zu zeigen, sondern ihn einfach mit addWindowController: gesetzt!

So funktionierts ohne Probleme, danke vielmals!
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Zum ersten Beitrag, am Ende:
Wenn du da Krieg zwischen den Instanzvariablen hast, gibt es wunderbarste Dinge. Bei Winow-Controllern gibt es da immer die Problematik. Inzwischen bin ich der Ansicht, dass ein Casting das einzig Wahre ist. (Siehe etwa Rodewig/Negm-Awad, Objective-C und Cocoa, S. 555)
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Es gibt noch eine 2te einfachere Möglichkeit das ganze zu lösen:

Im NSDocument:

Code:
- (void)showWindows
{
       [super showWindows];

	if	([userInfo count] == 0)
	{
		userInfoWindowController *sheetController = [[userInfoWindowController alloc] initWithDocument:self];
		[sheetController showWindow:nil];
	}
}
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Ich habe das Buch: Objective-C und Cocoa - Programmieren unter Mac OS X (ISBN: 3-908497-20-5)

Aber meins geht nur bis S527, dann kommt der Index :)

Danke für deine Mühe, aber ich habe das Problem, wie im letzten Post beschrieben, gelöst.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Du hast Rodewig, Objective-C und Cocoa.
Du hast aber nicht Rodewig/Negm-Awad, Objective-C und Cocoa. ;)

So, wie du es gelöst hast, ist es ja auch richtig … Und so steht es auch auf S. 555.