Problemes amb nstextfield
hola de nou no entenc una cosa tinc un NSTextfield i nomes li puc
introduir dades desde un IBAction, si ho provo desde un metode normal no em funciona, ¿em podries explicar per que?.
19 maig 2009 00:51
Pel que m'expliques, aprofites el paràmetre de l'IBAction per accedir al NSTextField. Però això només funciona si el que crida l'acció és el propi NSTextField, i aquest element s'envia com a paràmetre.
- (IBAction) action:(id)sender;
Si vols accedir a un element de la interfície gràfica cal que l'enllacis amb un IBOutlet com una variable de la classe on vols executar el mètode. Més o menys així:
@class Controller
{
IBOutlet NSTextField *myText;
}
- (void) method;
@end
Un cop fet això des de l'Interface Builder has d'enllaçar l'Outlet (arrossegant el botó dret des de l'objecte de la classe on hi ha l'Outlet fins a l'element NSTextField.
I en el mètode ja hi pots accedir des del mètode
- (void) method;
{
[myText setString:@"Nou text"];
}
Espero que m'hagi explicat.
19 maig 2009 08:55
Be no es aixo el que em pasa ,vull dir que si crido el metode que accediex al outlet des de una altre clase no funciona.
19 maig 2009 12:59
Bé, això és lògic. Només es pot pot accedir a l'Outlet des de la classe que s'ha definit. Sempre pots definir-lo en un altre objecte, però normalment només és fica en una classe "controladora".
Una altra opció que tens és utilitzar el "binding", però això el que fa és enllaçar el valor d'un element de la interfície amb el valor d'una variable. Funciona molt bé, però no s'hi pot jugar massa.
Si em planteges el problema segur que et puc ajudar una mica més. 
19 maig 2009 13:06
Be aqui hi ha el codi i una explicacio: en el ficher controlapp.h tinc aixo
IBOutlet id Bazaspedidas1; //son els nstextfields
IBOutlet id Bazaspedidas2;
IBOutlet id Bazaspedidas3;
despres en el ficher controlapp.m tinc aquest metod:
-(void)textos_bazas_pedidas:(int)J1:(NSString*)nom_jugador
{
NSLog(@"valor1 = %i",J1);
empieza = 4;
if (empieza == 4) {
if (nom_jugador == @"jugador1") {
int bazas_acuales = [Bazaspedidas1 intValue];
int bazas_nuevas = bazas_acuales + J1;
[Bazaspedidas1 setIntValue:bazas_nuevas];
}
if (nom_jugador == @"jugador2") {
[Bazaspedidas2 setIntValue:J1];
}
if (nom_jugador == @"jugador3") {
[Bazaspedidas3 setIntValue:J1];
}
}
i vull cridar el metod anterior desde una altre clase "jugador.m" amb aquest metod:
-(void)pidebazas:(int)empieza:(int)ronda:(NSString*)nom_jugador:(NSString*)triunfopalo:(NSString*)cartapalo:(int)cartanum
{
controlapp *Capp = [[controlapp alloc]init];
bazas_pedidas = 0;
if (empieza == 4){
if ( (ronda == 1) & (triunfopalo == cartapalo)){
bazas_pedidas = bazas_pedidas + 1;
}
else if ( (ronda == 1) & (triunfopalo != cartapalo)){
bazas_pedidas = 0;
}
}
[Capp textos_bazas_pedidas:bazas_pedidas : nom_jugador]; //el metod que inserta el numero al nstextfield
}
y no funciona no s'introdueix res al nstextfield. sembla que si es crida al metod que inserta el numero al textfield desde una altre clase no funciona
19 maig 2009 19:30
Lluís, primer dir-te que si vols ficar codi als comentaris l'afegeixis entre dues línies amb quatre o més caràcters (=) i res més. Així et respectarà els espais i tabuladors:
====
El codi d'aquí a dins serà d'amplada fixa.
====
Mirant el teu codi, hi veig un possible error aquí:
controlapp *Capp = [[controlapp alloc]init];
Estàs creant un nou controlador dins d'aquest mètode i les seves variables no estaran enllaçades.
El NSTextField "Bazaspedidas1" segurament els tens enllaçats amb l'Interface Builder, on estan representats per el TextField de la interfície i l'objecte controlador (un cub de color blau).
El cub de color blau és un objecte (una instància) de la classe que se li ha indicat. Això vol dir que si vols modificar el NSTextField hauràs d'utilitzar aquell objecte.
Una manera de fer-ho seria que a la classe Jugador la inicialitzis enviant-li l'objecte controlador com a paràmetre. Llavors el pots desar a dins i utilitzar-lo. Això farà que et funcioni.
De totes maneres lo anterior que t'he dit no és una forma correcta de treballar, ja que es barregen els objectes controladors amb els objectes del model i el model (jugador) acaba controlant la vista (la representació).
En un model MVC (Model - Vista - Controlador) el model hi ha les classes que representen les dades i el funcionament bàsic i ha de funcionar independentment de si es té interfície gràfica. El controlador s'encarrega de controlar el funcionament del model (iniciar partides, afegir jugadors, …) i és l'intermediari amb la interfície que s'encarrega de mostrar-ne els continguts i aplicar les accions al model.
És a dir, que el model no ha de modificar en cap cas la interfície, només les pròpies dades. És el controlador que s'ha d'encarregar d'aquesta feina.
No sé si tens molts coneixement de programació, però si no saps anglès fa temps vaig traduir algun dels manuals d'Apple que et poden ajudar:
- http://comesfa.xin.cat/Categoria:Objective-C
20 maig 2009 08:49
Vale, gracies, em guardare el link dels manuals , en angles es una mica liat.
21 maig 2009 17:20
