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

Sheet unmittelbar nachdem das Document-Fenster erscheint

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Poljpocket, 10.08.07.

  1. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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.
     
  2. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Zeig mal deinen Code zur Anzeige des Sheets …
     
  3. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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.
     
  4. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Das was ich genau meine, passiert zum Beispiel bei Apple's Pages App (Auswahl des Designs...).
     
  5. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    "Zeig mal deinen Code zur Anzeige des Sheets"

     
  6. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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];
    }
    
     
  7. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    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?
     
  8. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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.
     
  9. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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;
    }
    
     
  10. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    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.
     
  11. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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.
     
  12. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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!
     
  13. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    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)
     
  14. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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];
    	}
    }
    
     
  15. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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.
     
  16. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    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.
     

Diese Seite empfehlen