Domanda

Sono un completo n00b con MacRuby e Cocoa, quindi tienilo a mente quando rispondi: ho bisogno di molti dettagli e spiegazioni. :)

Ho impostato un semplice progetto che contiene 2 finestre, entrambe costruite con Interface Builder. La prima finestra è un semplice elenco di account che utilizzano una visualizzazione tabella. Ha un pulsante "+" sotto la tabella. Quando faccio clic sul pulsante +, desidero visualizzare una finestra "Aggiungi nuovo account".

Ho anche un AccountsController < NSWindowController e una classe AddNewAccountController < NSWindowController, configurati come delegati per queste finestre, con i metodi di clic del pulsante appropriati cablati e prese per fare riferimento alle finestre necessarie.

Quando faccio clic sul pulsante "+" nella finestra Account, viene visualizzato questo codice:

    @add_account.center
    @add_account.display
    @add_account.makeKeyAndOrderFront(nil)
    @add_account.orderFrontRegardless

funziona alla grande la prima volta che faccio clic sul pulsante +. Viene visualizzato tutto, posso inserire i miei dati e legarli al mio modello. tuttavia, quando chiudo il modulo per l'aggiunta di un nuovo account, le cose iniziano ad andare male.

se imposto il rilascio della finestra di aggiunta di un nuovo account alla chiusura, la seconda volta che faccio clic sul pulsante +, la finestra verrà comunque visualizzata ma è bloccata. non posso fare clic su alcun pulsante, inserire dati o persino chiudere il modulo. presumo che ciò sia dovuto al fatto che il codice del modulo è stato rilasciato, quindi non c'è alcun loop di messaggi che elabora il modulo ... ma non ne sono del tutto sicuro.

se imposto la finestra di aggiunta di un nuovo account in modo che non venga rilasciata alla chiusura, la seconda volta che faccio clic sul pulsante +, la finestra viene visualizzata correttamente ed è utilizzabile, ma contiene ancora tutti i dati che avevo inserito in precedenza. .. è ancora associato alla mia precedente istanza della classe Account.

cosa sto facendo di sbagliato? qual è il modo corretto per creare una nuova istanza del modulo Aggiungi nuovo account, creare un nuovo modello di account, associare quel modello al modulo e visualizzare il modulo, quando faccio clic sul pulsante + nel modulo Account?

... tutto questo viene fatto su OSX 10.6.6, 64 bit, con XCode 3.2.4

È stato utile?

Soluzione

Il problema è che non crea la finestra ogni volta. Il rilascio alla chiusura è un'opzione un po 'fastidiosa e generalmente viene utilizzato solo se sai che anche il controller della finestra viene rilasciato quando la finestra si chiude. (Nota che non ho mai usato MacRuby, quindi fornirò il codice in Obj-C poiché so che è corretto, spero che tu possa convertirlo. Suppongo che GC sia attivo come dovrebbe essere con MacRuby). < / p>

Ora ci sono due modi per farlo. Non sono del tutto sicuro di come siano impostati i tuoi NIB / classi in quanto potrebbero essere due modi.

-

Il primo modo per risolverlo è utilizzare i punti vendita che utilizzi per fare riferimento agli elementi del modulo per cancellarli quando visualizzi di nuovo la finestra, ad esempio [myTextField setStringValue: @ ""]. Se stai usando legature di cacao, allora è un po 'più complicato, ma fondamentalmente devi assicurarti che l'oggetto rilegato sia cancellato. Tuttavia, consiglierei contro gli attacchi se sei nuovo a Cocoa.

-

Il secondo modo è rendere la classe AddNewAccountController una sottoclasse di NSWindowController. Quando si preme il pulsante +, si creerà una nuova istanza e la si visualizzerà (ricordarsi di memorizzarla in un ivar). Il modo migliore per farlo sarebbe:

if (!addAccountController) {
    addAccountController = [[AddNewAccountController alloc] initWithWindowNibName:@"AddNewAccountController"];
    [[addAccountController window] setDelegate:self];
}
[addAccountController showWindow:self];

Ciò impedisce di creare una nuova istanza se la finestra è già visibile. È quindi necessario implementare il delegato:

- (void)windowWillClose:(NSNotification *)notification {
    //If you don't create the account in the AddNewAccountController then do it here
    addAccountController = nil;
}

Ovviamente dovresti spostare la finestra in un NIB separato chiamato "AddNewAccountController". In questo NIB assicurati di impostare la classe del proprietario del file su AddNewAccountController e quindi di collegare l'uscita della finestra del proprietario del file alla finestra.

Quando tutto questo è impostato, otterrai ogni volta un nuovo controller / finestra. Ha anche il vantaggio di suddividere pennini e controller in unità più mirate.

-

Un'ultima cosa. Anche se va bene fare qualcosa di simile in una finestra, potresti voler vedere come farlo tramite un foglio, in quanto impedirebbe la possibilità che la finestra di aggiunta dell'account venga nascosta dietro altre finestre.

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