IPB     Il futuro di Tevac dipende da te!  

Benvenuto Visitatore ( Log In | Registrati )

Il TevacPhoto Contest di Luglio: TERRA!! (scad. 26 luglio)

  · · · · · · · · · · · ·
Reply to this topicStart new topic
> [Cocoa] NSArrayController e comunicazione con NSTextField
ricktriv
messaggio 30 Aug 2006, 15:05
Messaggio #1


Level 5/11
*****

Gruppo: Forum User +
Messaggi: 508
Iscritto il: 21-February 04
Utente Nr.: 1.555



Ciao a tutti,
scusate l'ennesimo post, ma prometto che per due settimane non ne aprirò più! icon_redface.gif

Sto cercando di imparare ad usare NSArrayController e vi presento un problema che non sono proprio riuscito a risolvere.

Lo scopo "stupido" dell'app e far scrivere all'utente un numero e poi memorizzarlo (se l'utente lo vuole) assieme a data e ora in una tabella.
L'applicazione è formata da due finestre; nella prima c'è un NSTextField e un pulsante ("Save") e nella seconda una NSScrollView su cui un NSArrayController visualizza i dati che via via aggiungo (o rimuovo).

Quando schiaccio il pulsante nella prima finestra viene creato un nuovo elemento nella NSScrollView, ma come faccio a inizializzare questo valore con il numero che l'utente ha inserito in NSTextField?

Il progetto si trova qui:
http://trive.110mb.com/mac/Counter_2.0.zip

Questa è quello che ho fatto finora:
quando l'utente schiaccia il pulsante "Save" viene mandato un messaggio a NSArrayControlle affinchè venga creato un nuovo elemento di tipo SavedNum (classe che ho fatto io).
Allora ho fatto l'over-riding di init: (di SavedNum); ma come fa a richiedere il numero contenuto in NSTextField?
Visto che è un'istanza nuova (appena creata da NSArrayController) l'eventuale outlet non è inizializzato a nulla...
...E' dunque possibile inizializzare un outlet NON DA IB ma con del codice?

Ringrazio chiunque mi dia un aiuto, anche piccolo.
Un saluto.
Marco.


--------------------
Power corrupts.
PowerPoint corrupts absolutely.
Go to the top of the page
 
+Quote Post
ricktriv
messaggio 31 Aug 2006, 11:15
Messaggio #2


Level 5/11
*****

Gruppo: Forum User +
Messaggi: 508
Iscritto il: 21-February 04
Utente Nr.: 1.555



Siccome mi rendo conto che il post è abbastanza "impegnativo" (nel senso che richiede tempo leggere e comprendere il problema), formulo una domanda più generica.

Supponiamo che io abbia un oggetto e che questo voglia mandare un messaggio ad un altro oggetto.
Il primo oggetto NON conosce l'altro oggetto (ovvero non è impostato un outlet) ma sa dove si trova (all'interno di una tal finestra) e che tipo di oggetto è (ad esempio NSTextField); c'è un modo per far comunicare questi oggetti pur senza aver a priori impostato un outlet?


Vi ringrazio.


--------------------
Power corrupts.
PowerPoint corrupts absolutely.
Go to the top of the page
 
+Quote Post
djzero00
messaggio 31 Aug 2006, 11:57
Messaggio #3


Level 4/11
****

Gruppo: Forum User
Messaggi: 397
Iscritto il: 14-November 03
Da: Treviso
Utente Nr.: 936



sono lontano da un mac, quindi non ho potuto rispondere alla prima.
Ci provo con la seconda.
La risposta è: generalmente sì, ma dipende dagli oggetti.
In prima battuta, segnalo che "outlet", a livello di linguaggio, significa nulla. Non è altro che un modo per individuare esplicitamente dei (puntatori a degli) oggetti. Quindi un outlet può essere tranquillamente inizializzato (o modificato) da codice, trattandosi di una variabile come un'altra.
Per il problema del collegamento, ci sono due precondizioni:
1- l'oggetto sorgente (il "primo") conosca almeno un padre gerarchico dell'oggetto destinazione (il "secondo"). Ad esempio, il sorgente conosce l'oggetto finestra dove è contenuto (con un outlet o comunque un puntatore)
2- sia possibile discendere dal padre ai vari figli, ed individuare in modo univoco l'oggetto destinazione (attraverso outlet o altri puntatori predefiniti).
Senza 1, abbiamo un oggetto sorgente che non sa dove si trova, anche se qualcosa si può fare comunque (ci sono oggetti predefiniti che può sempre ricavare, ad esempio l'applicazione attraverso la variabile globale NSApp, o le finestre, o qualcosa del genere).
La ricerca dell'oggetto destinazione scendendo di padre in figlio è più semplice di quanto si pensi. Ad esempio una finestra rende disponibile l'elenco (gerarchico) delle view che la compongono, ed è quindi possibile discendere di view in view fino a cercare la destinazione (che dovrà in qualche modo essere univocamente determinata, perché ad esempio è l'unico oggetto di quella classe presente...).
Poi ci sono dei "trucchi"; ad esempio, se l'oggetto sorgente è creato "a molla" (si crea, fa qualcosa, produce un valore, muore, qualcuno deve usare un valore), basta creare l'oggetto sorgente con un riferimento (leggi, una variabile d'istanza, ovvero un outlet) alla destinazione. Questo è possibile quando l'oggetto che crea il tutto conosce sia la sorgente (che sta creando) sia la destinazione...
Mi rendo conto che è tutto un po' confuso, ma magari stasera raggiungo un mac e mi spiego meglio...


--------------------
Arrivederci e grazie per tutto il pesce
Macocoa, Megaphone, Flickr
Go to the top of the page
 
+Quote Post
ricktriv
messaggio 31 Aug 2006, 23:20
Messaggio #4


Level 5/11
*****

Gruppo: Forum User +
Messaggi: 508
Iscritto il: 21-February 04
Utente Nr.: 1.555



La seconda idea è ottima, ma non ho trovato nulla al riguardo.

Sarebbe bello avere un metodo così:
CODICE
+ (NSArray *)istances;

che in sostanza mandando un messaggio alla classe, ad es:
CODICE
arrayOfNSTextFieldIstances = [NSTextField istances];

mi restituisca un array contenente tutte le istanze di una certa classe.

Qualcuno sa se esiste? Nella documentazione non l'ho trovato.


--------------------
Power corrupts.
PowerPoint corrupts absolutely.
Go to the top of the page
 
+Quote Post
djzero00
messaggio 1 Sep 2006, 08:30
Messaggio #5


Level 4/11
****

Gruppo: Forum User
Messaggi: 397
Iscritto il: 14-November 03
Da: Treviso
Utente Nr.: 936



Ieri sera ho dato una scorsa veloce al progetto, ed ho visto che la cosa e', per me, più complicata del previsto. Infatti tutto nasce dal fatto che utilizzi i Bindings, argomento di cui so proprio nulla.
In realta' al momento dell'inserimento del nuovo dato all'interno dello array controller hai tutte le informazioni a disposizione (numero immesso, puntatori verso tutti gli elementi necessari). Pero' nel poco tempo che avevo a disposizione non sono riuscito a capire come fare in modo pulito il tutto.


--------------------
Arrivederci e grazie per tutto il pesce
Macocoa, Megaphone, Flickr
Go to the top of the page
 
+Quote Post
ricktriv
messaggio 1 Sep 2006, 15:47
Messaggio #6


Level 5/11
*****

Gruppo: Forum User +
Messaggi: 508
Iscritto il: 21-February 04
Utente Nr.: 1.555



CITAZIONE(djzero00)
Infatti tutto nasce dal fatto che utilizzi i Bindings, argomento di cui so proprio nulla.
...
Pero' nel poco tempo che avevo a disposizione non sono riuscito a capire come fare in modo pulito il tutto.


Ho deciso di obbligarmi ad imparare almeno un po' sui bindings (=meno codice)...
Se hai del tempo per aiutarmi nei prossimi giorni ti ringrazio molto.

PS: per chi non avesse tempo di guardare il progetto (e lo capirei) in sostanza c'è una classe (SavedNum) che rappresenta dei numeri salvati (assieme a data e ora, quindi sono due instance variable), di cui vengono aggiunte istanze in una specie di Array, l'Array Controller.

Ho fatto l'overriding del loro "init:" in modo che le instance variables vengano inizializzate; in particolare una dovrebbe essere inizializzata al valore contenuto nell'NSTextField.
Essendo però un'istanza appena creata, come fa a comunicare con NSTextField?


--------------------
Power corrupts.
PowerPoint corrupts absolutely.
Go to the top of the page
 
+Quote Post
djzero00
messaggio 1 Sep 2006, 20:48
Messaggio #7


Level 4/11
****

Gruppo: Forum User
Messaggi: 397
Iscritto il: 14-November 03
Da: Treviso
Utente Nr.: 936



Ho guardato il progetto, e secondo me abbimo un problema prospettico più che tecnico.
Abbiamo un oggetto creatore (AppControl, in risposta ad un clic sul pulsante Save) ed un oggetto creato (il SavedNum). Da come hai realizzato le cose, è l'oggetto creato che deve preoccuparsi di mettere a posto i propri valori. L'oggetto creatore ha l'unica responsabilità di scatenare le operazioni (proclamando l'aggiunta di un oggetto allo arrayController).
Invece, secondo me, la prospettiva deve essere rovesciata. E' l'oggetto creatore (ovvero AppControl) a dover costruire l'oggetto creato SavedNum, e poi aggiungerlo allo arraycontroller.
Con questo rovesciamento, le cose sono decisamente più semplici.
Ecco il metodo associato al pulsante Save:
CODICE
- (IBAction)save:(id)sender

{

    SavedNum    * theNum = [[ SavedNum alloc] init ];

    [ theNum setNum: [ NSNumber numberWithInt: [textField intValue]] ];

    [array addObject: theNum ];

    [panel setIsVisible:YES];

}

Viene creato l'oggetto SavedNum, gli viene attribuito un buon valore, e poi viene aggiunto allo arrayController.
Qui c'è l'altro problema (che mi confondeva il precedente). Tu usavi il metodo add: (che, per altro, è di NSObjectController, superclasse dello arrayController). Leggendo la documentazione, ho capito poco, ma sembra che costruisca un oggetto generico e che poi lo agigunga allo arrayController. Il metodo invece più adatto ad aggiungere elementi è addObject:. Così facendo, adesso la lista dei numeri salvati corrisponde.
Ma, ribadisco, secondo me tutto nasce da un (inconsueto e secondo me sbagliato) rovesciamento della prospettiva naturale del funzionamento.


--------------------
Arrivederci e grazie per tutto il pesce
Macocoa, Megaphone, Flickr
Go to the top of the page
 
+Quote Post
ricktriv
messaggio 2 Sep 2006, 11:38
Messaggio #8


Level 5/11
*****

Gruppo: Forum User +
Messaggi: 508
Iscritto il: 21-February 04
Utente Nr.: 1.555



Grazie mille!

Non avevo pensato di fare come hai proposto tu perchè pensavo che ad NSArrayController si potesse solo dire "aggiungi un nuovo oggetto all'array (ma creamelo tu)" e non "aggiungi l'oggetto che ho appena creato all'array".

Probabilmente add: e insert: (di cui non ho capito la differenza) si occupano di crearmi l'oggetto mentre addobject: aggiunge all'array un oggetto che ho creato io.

Dunque grazie ancora!


--------------------
Power corrupts.
PowerPoint corrupts absolutely.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic

 

Collapse

> 

    Titolo discussione Risposte Autore discussione Visite Ultima azione
No new   11 marg 747 2 July 2008 - 08:11
Ultimo messaggio di: marg
No New Posts   4 germinara 125 22 June 2008 - 14:29
Ultimo messaggio di: sirguich_
No New Posts   2 sirguich_ 118 9 June 2008 - 23:14
Ultimo messaggio di: sirguich_
No new   10 Ale93 182 1 June 2008 - 23:15
Ultimo messaggio di: Ale93
No New Posts   0 mauroga 759 3 April 2008 - 16:22
Ultimo messaggio di: mauroga
No New Posts   1 Alba 131 28 March 2008 - 14:34
Ultimo messaggio di: Marco Coïsson
No new   11 Cpu86 331 23 March 2008 - 11:14
Ultimo messaggio di: Cpu86
No New Posts   2 nutsmuggler 251 12 March 2008 - 16:17
Ultimo messaggio di: nutsmuggler
No new   10 marg 288 25 February 2008 - 22:10
Ultimo messaggio di: marg
No New Posts   5 marg 260 7 February 2008 - 16:16
Ultimo messaggio di: poweruser
No New Posts   2 simotessa 327 25 January 2008 - 15:23
Ultimo messaggio di: simotessa
No new   12 brubeck 481 13 January 2008 - 15:11
Ultimo messaggio di: brubeck

Modalità di visualizzazione: Normale · Passa a: Lineare · Passa a: Outline


RSS Versione Lo-Fi Oggi è il: 25 July 2008 - 11:39
IP.Board Skin Developed By Creative Networks