Domanda

Nel mio codice qui sotto, CustomWindow è una sottoclasse di NSWindow.

CustomWindow *window = [[CustomWindow alloc] init];
if (![NSBundle loadNibNamed:@"NibName" owner:window])
[window center]; // doesn't work

Come si ottiene un puntatore a controllare il vostro XIB dopo aver caricato in modo da poter fare cose come centrare il NSWindow (intendo quella serializzato che risiede all'interno del XIB)?

Che cosa sto facendo male qui?

È stato utile?

Soluzione

Si deve usare una sottoclasse NSWindowController. NSWindowController è specificamente progettato per fare esattamente quello che si vuole raggiungere e risolve diversi problemi che si andrà in contro se si carica il pennino direttamente utilizzando i metodi di NSBundle. È in genere consigliabile utilizzare sempre una sottoclasse NSWindowController per gestire le finestre.

Create una sottoclasse di NSWindowController:

@interface MyWindowController : NSWindowController {}
@end

@implementation MyWindowController
- (id)init
{
    self = [super initWithWindowNibName:@"MyWindow"];
    if(self)
    {
        //initialize stuff
    }
    return self;
}
//this is a simple override of -showWindow: to ensure the window is always centered
-(IBAction)showWindow:(id)sender
{
    [super showWindow:sender];
    [[self window] center];
}
@end

In Interface Builder, impostare la classe di proprietario del file per essere MyWindowController e collegare l'uscita window di proprietario del file per l'oggetto finestra nel vostro pennino.

È quindi possibile visualizzare la finestra in questo modo:

MyWindowController* controller = [[MyWindowController alloc] init];
[controller showWindow:self];

Altri suggerimenti

  

Nel mio codice qui sotto, CustomWindow è una sottoclasse di NSWindow.

CustomWindow *window = [[CustomWindow alloc] init];
if (![NSBundle loadNibNamed:@"NibName" owner:window])
[window center]; // doesn't work
     

Come si ottiene un puntatore per il controllo del XIB dopo aver caricato in modo che lei possa fare cose come centrare il NSWindow all'interno del XIB?

“centrando il NSWindow all'interno del XIB” non ha senso (si dovrebbe centrarlo sullo schermo ), a meno che non si intende centrare l'oggetto NSWindow che si trova all'interno del XI ter, nel qual caso, perché sono si crea un altro oggetto NSWindow (CustomWindow) al di fuori del XI ter?

Ricordate che un pennino (o XI ter) è un archivio di oggetti. Se si desidera utilizzare una finestra che avete nel vostro pennino, è necessario creare uno sbocco per puntare a quella finestra, impostare la classe del proprietario del file per essere la classe in cui è stato aggiunto alla presa, collegare l'uscita in IB, e nominare l'oggetto con l'uscita come il proprietario del file passandolo all'argomento owner:. Questo oggetto, come il proprietario, sarà quindi responsabile per lavorare con la finestra. Può essere (di solito è, nel mio codice) lo stesso oggetto che carica il pennino.

Inoltre, init non funziona su NSWindow; è necessario utilizzare initWithContentRect:styleMask:backing:defer: o initWithContentRect:styleMask:backing:defer:screen:. Utilizzando init sarebbe solo valida se hai implementato te init in CustomWindow, e utilizzato uno di questi due selettori per il messaggio [super init…].

Probabilmente non si vuole rendere la vostra finestra del file proprietario. Normalmente si dovrebbe passare self o qualche oggetto controller lì. Poi, se self o quell'oggetto controllore ha un IBOutlet CustomWindow, otterrà collegato quando si chiama loadNibNamed:. Scopri questo post per esempio di codice.

Un XIB è un contenitore per gli oggetti, non è uguale a una finestra. Non si può centrare una XIB, si può solo centrare una finestra contenuta in un XIB.

Inoltre, gli oggetti del XIB sono creati quando lo si carica. Non passa un oggetto come proprietario che poi si trova in per uno degli oggetti del XIB, si utilizza invece IBOutlets per ottenere riferimenti ai nuovi oggetti creati durante il caricamento del XIB e poi si può interagire con loro.

oggetto proprietario del file è un oggetto speciale in XIBs, in quanto è l'unico oggetto che non è creato e che è possibile specificare per passarlo a loadNibNamed:owner:. E 'il gateway tra gli oggetti XIB-creato e la vostra applicazione.

Di solito, l'oggetto proprietario è una sorta di classe controller. Impostare la classe del file di istruzioni in Interface Builder per la classe del controller, quindi definire alcuni IBOutlets nella classe, che verranno visualizzati in Interface Builder sul proprietario del file ed è possibile collegare gli oggetti in XIB per loro.

Infine, quando si passa l'oggetto controller per loadNibNamed:owner:, cacao si collegherà i tuoi IBOutlets agli oggetti appena creati e li si può utilizzare per interagire con loro, ad esempio, per centrare una finestra nella vostra XIB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top