Jump to content

Duda Objective-C


oscarfg

Recommended Posts

Hola.


Estoy haciendo mis pinitos con la programación en Objective-C para iOS, y estoy atrapado con un problema que tal y como yo lo veo debe ser una chorrada como un piano de grande, pero no consigo saber la causa.

 

Tengo este trozo de código que se ejecuta dentro de un método lanzado al pulsar sobre un botón:

 

    Contacto * contacto;
    NSLog(@">>> nombre: %@", self.txtNombre.text);
    contacto.nombre = self.txtNombre.text;
    NSLog(@">>> nombre objeto: %@", contacto.nombre);

Contacto es una clase con varios campos de tipo NSString, entre ellos, nombre. Por otro lado, txtNombre es un Text Field de la vista asociada al controlador en el que se encuentra el código.

 

Bien, pues viendo las trazas de log, obtengo lo siguiente:

 

2013-08-25 19:35:49.381 Agenda[9021:c07] >>> nombre: Pepe
2013-08-25 19:35:49.382 Agenda[9021:c07] >>> nombre objeto: (null)

Es decir, recupera el valor correcto que introduzco en el text field, pero después de asignar este valor al campo nombre del objeto contacto, si quiero visualizar el contenido de dicho campo, me devuelve null.

 

Supongo que es una tontería, pero no consigo ver donde está el fallo.

 

¿Algún gurú del Objective-C me puede iluminar?

 

Gracias.

 

Saludetes!

Link to comment
Share on other sites

Guest Darkness

Este es un error relativamente común, bueno más que un error un caso típico en el que falta un paso que no suele ser muy evidente y sí algo puñetero. Asegúrate de que el Text Field esté conectado con tu fichero a través del Interface Builder, y declarado como un IBOutlet en tu fichero de cabecera:

 

 

IBOutlet UITextField *txtNombre;

 

Si no es así no podrás realmente pasar el texto al string. Esto se produce porque el IBOutlet hace de puente entre el objeto físico en pantalla y el programa en Objective C que recoge el contenido.



Si no es eso seguimos mirando.

Link to comment
Share on other sites

Hola Darkness.

 

Gracias por la respuesta. El IBOutlet está creado en el .h, y de hecho, se está recuperando bien el valor, ya que la primera traza de log muestra efectivamente el nombre que introduzco en el Text Field. El problema viene después, cuando asigno ese valor (que en principio es correcto, ya que sale bien en el log) a un campo de la clase, y si muestro el valor de ese campo, está a null.

 

Bueno, seguiré investigando. De momento creo que mejor no mando el curriculum para colaborar en el Awacs T.S. :whistling:

 

Saludos!

Link to comment
Share on other sites

Guest Darkness

¿Cómo tienes referenciado el atributo nombre? ¿Estás usando el proyecto con ARC? ¿Estás usando @synthetyse? Son preguntas un poco todas relacionadas con el tema, quiero decir, tiene que haber algún problema en la definición del NSString para que te dé el problema.

 

Es que estas cosas aparentemente tan tontas me cabrean en grado sumo, si quieres pásame el proyecto y te lo miro. Pero tengo que saber qué pasa o reviento :game:

Link to comment
Share on other sites

Hola de nuevo.


Darkness, te he enviado el proyecto entero, está creado en XCode. Por experiencia en programación en otros lenguajes, estas cosas que le rompen los cuernos a uno suelen ser las chorradas más grandes, pero cuesta dar con ellas.


Gracias por el interés.

 

Un saludo.

Link to comment
Share on other sites

Guest Darkness

De nada, me encantan estas cosas sencillas que no funcionan sin razón aparente. Es un modo de aprender cosas nuevas que a veces se escapan en proyectos grandes y te vuelven loco. Si lo has visto antes en un ejemplo sencillo luego ya no te pilla el toro en el proyecto grande o al menos lo tienes más controlado.

Link to comment
Share on other sites

A parte de lo que ha dicho Darkness, el problema puede estar en que no has inicializado el objeto contacto. Deberías poner Contacto * contacto = [[Contacto alloc] init]; pues tal y como lo tienes puesto el objeto contacto sólo está declarado. Si pones un break point en esa línea y la ejecutas verás que en contacto tienes 0x00000000. Así pues, el problema no estaría en el outlet, sino en que el objeto contacto realmente no existe.

 

Mi consejo es que te crees para este tipo de objetos, un init, o varios a tu gusto, aunque no hace falta, pues haciendo el @synthesize para todos los atributos públicos ya se pueden leer y escribir; por ejemplo:

 

- (void) initWithNombre: (NSString *) _nom Apellidos: (NSString *) _apellidos ..... etc.

 

normalmente con 1 vale y los campos que no quieras rellenar para un contacto determinado los pones a nil, así los defines en una sola línea y no tienes que andar "rellenando" campos. El init sería el equivalente, salvando las distancias, con el new de JAVA o C#.

 

Espero que te sirva. Salu2 a to2.

Edited by DuarthVader
Link to comment
Share on other sites

Guest Darkness

Yo había probado la inicialización pero es un objeto NSObjectmanaged y además está usando ARC por lo que el alloc init no funciona (al menos en mi versión de XCode que es la 4.6).

 

En cualquier caso hay que inicializar el objeto efectivamente.

Link to comment
Share on other sites

DuarthVader, gracias por los comentarios. Efectivamente viniendo del mundo Java, me cuesta cambiar el chip para ciertos conceptos.

 

Como apuntas, al igual que Darkness, me estaba faltando la inicialización del objeto. En mi caso, al tratarse de un NSManagedObject, lo estoy inicializando con el método insertNewObjectForEntityForName, pero lo estaba haciendo después de asignar los valores. Obviamente, asignando los valores después de inicializar el objeto, estos valores se guardan correctamente.

 

Lo dicho, fallo de principiante...

Mucha gracias a los dos por el interés y por los comentarios.

 

Saludos!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

Some pretty cookies are used in this website