Curs Cocoa ::: AppDot ::: Part 3

En aquesta tercera part de l'aplicació AppDot veurem com funciona el paradigma Key Value Observing (KVO) que ens permet definir observadors que estaran informats quan un valor canvia. Així podem aconseguir que diferents vistes puguin estar informats dels canvis del punt i re-dibuixar-se a mida que aquest canviï.

imatge

Podeu trobar aquesta nova classe en la plana destinada als vídeos del curs. Allà hi podeu trobar els vídeos, el projecte que s'ha desenvolupat i l'enllaç a aquest tema del fòrum.
- http://public.poble.cat/MacOSX/XCode/#cocoa-appdot-cap3

Xin  sep  14 juny 2008 08:25

Acabo de veure aquest ultim screencast i m'ha fet gracia veure que just parlaves del KVC, quina casualitat, el que vaig necessitar al convertir el AppDot2. Fins i tot t'avies oblidat de fer el dealloc!

Sobre la resta, molt interessant, ara que comences a dividir tasques per classes, es veu el potencial dels llenguatges orientats a objectes. L'únic que encara no entenc gaire bé es perquè pot interessar fer les relacions per l'interface builder en comptes de per codi, però com ja comentes, això ho veurem en altres exemples. El que si et volia preguntar es per la part on compares els strings o fas així:

if( [keyPath = @"center"]) ....

amb només un "=", si ho fessis, amb dos ( "==" ) no funcionaria? O només es pot amb "isEqualToString(NSString)" ?

Sobre aquest exemple en versió iPhone, suposo que ho intentaré però no ho publicaré, ja que aquest canvis em semble son exactament iguals als que has fet tu. Però si veig alguna cosa important, ja ho comentaré.

Volia aprofitar el tema de que has creat dues finestres i es que hi han moltes aplicacions que utilitzen varies finestres, com el safari, però hi han altres aplicacions que utilitzen només una i que aquesta va canviant segons les opcions escollides, com el panell de preferències del sistema. Es aquest segon cas el que més m'interessa ja que les aplicacions de l'iPhone funcionen així. Podries comentar com es fa? Ara estic en això i em semble que m'he embolicat.

Gracies

Jaime  sep  16 juny 2008 13:02

per cert, el switch que has intentat fer no funciona per això del "isEqualToString(NSString)"?

Jaime  sep  16 juny 2008 13:04

Anem per passos:

1.- M'havia oblidat el dealloc
Doncs sí, el que no sé és si ho he explicat o no. Perquè de vegades trobo els errors i els canvio sense explicar-ho. Sobretot quan veig que he dit una bestiesa i aturo la gravació i ho torno a explicar.

2.- Programació orientada a objectes
La POO és molt difícil d'interioritzar, sobretot si has començat amb llenguatges estructurats i si els llenguatges OO no et forcen a fer-ho així. El més important a l'hora de POO és tenir la capacitat i l'experiència que en un moment puguis canviar la forma de funcionar d'un codi que ja tenies. Per això crec que és molt interessant com desenvolupo aquest exemple, perquè pot fer veure a la gent quan és interessant prendre una decisió que implica separar part d'un codi en una nova classe. De totes maneres és difícil, fins i tot pels que ja fa temps que hi treballem.

3.- Relacions amb l'Interface Builder.
Bé, de la mateixa manera que t'interessa crear les finestres, vistes, botons, textos amb l'Interface Builder en comptes de fer-ho amb codi (que també és pot fer). Doncs et pot interessar utilitzar que altres objectes que no són gràfics també els creïs des d'allí. En la pròxima aplicació que fem veurem els controladors i altres coses.

4.- Comparar cadenes.
El llenguatge Objective-C a diferència del C++, no permet sobrecarregar operadors. Així que no pots utilitzar els operadors per fer operacions entre objectes. Per tant, si vols comparar una cadena, ho has de fer cridant un mètode.

5.- Les finestres.
El safari és un programa basat en documents, així que pots obrir diversos documents en diverses finestres (tants com vulguem). L'aplicació AppDot, encara que haguem creat una altra finestra, no és una aplicació multi-documents. El fet de modificar l'aspecte i el contingut de les finestres toca més endavant, en tinc un parell de preparades per l'octubre.

Si en tens molta necessitat obreu un fil nou i en parlem. Clar que no sé si a l'iPhone funciona igual que aquí. Ho hauràs d'adaptar.

6.- El switch només funciona amb comparacions "==" de tipus bàsic. Així que no serveix per a res amb objectes. Hi ha llenguatges, com el Python que ja ni el tenen el "switch" ja que és pot fer el mateix amb un "if: elif: else:".

Buf quin totxo que t'he fotut. :)

Xin  sep  16 juny 2008 13:51

No, si ja m'ha semblat que em passava una mica amb el meu post :D
La veritat es que m'ho has aclarit tot, així que gracies per l'esforç.

L'únic punt es el 5, que encara em confonc i a més a l'iPhone funciona diferent, sobretot si volem utilitzar les transicions amb el Core Animation... però prefereixo mirar-m'ho una mica més abans de preguntar-te res mes... sobre això :) Però avui t'has guanyat un descans. Ja continuarem!

Jaime  sep  16 juny 2008 21:29

Un altre pregunta, hi ha alguna diferencia en escriure

CGRect dotRect= CGRectMake([dot center].x - [dot radius], 
[dot center].y - [dot radius],
2*[dot radius],
2*[dot radius]);;

i
CGRect dotRect= CGRectMake(dot.center.x - dot.radius, 
dot.center.y - dot.radius,
2*dot.radius,
2*dot.radius);
?

Les dues funcionen, potser la primera va bé per emfatitzar que dot es una classe, però hi ha algun altre raó?

Jaime  sep  18 juny 2008 13:06

hm... exactament "dot" es una referència, però la pregunta es manté.

Jaime  sep  18 juny 2008 13:10

Hola Jaime,

Aquesta pregunta estaria millor al fòrum d'Objective-C, així no barregem tant les coses. I deixar aquest fil pel capítol del curs.

De totes formes et contesto:

La primera forma és la tradicional amb la primera versió de l'ObjC i la segona és amb la versió 2.0 de l'ObjectiveC. Com ha vaig comentar en algun lloc (no em fer dir on?) amb Leopard, Apple ha modernitzat el llenguatge Objective-C per atansar-lo més al camí dels llenguatges moderns del tipus del Python.

La principal incorporació en aquesta nova versió van ser les propietats, que de forma automàtica et generen els mètodes "sets" i "gets". I el fet que és pugui utilitzar la notació amb punts per accedir als elements interns dels objectes.

Així ambdues maneres d'accedir als valors són idèntiques, realment la primera es codifica com la segona:

dot.center
[dot center]

I a l'hora de desar valors també hi ha les mateixes equivalències
dot.center = CGMakePoint(1,2);
[dot setCenter:CGMakePoint(1,2)];

En el cas de la "y" i la "x" no hi ha mètodes "set" i "get" perquè no són objectes sinó estructures de dades. Així que s'ha de mantenir la notació de les estructures: el punt ".".

Xin  sep  18 juny 2008 13:24

Es veritat, m'he equivocat de lloc per preguntar això, però gracies per la resposta.

He finalitzat l'exercici per l'iPhone i aquesta vegada no hi ha calgut fer cap canvi especial en el codi. L'únic canvi del fet que només pots tenir una finestra oberta a la vegada, però en aquesta finestra pots tenir dos views, o els que vulguis, i així ho he fet. Però la resta, tot igual :)

Jaime  sep  18 juny 2008 14:01

Selecciona'l abans d'enviar el commentari