2009-04-28 9 views
14

Hola Tengo el siguiente código en un ViewController.h:Objetivo-c Iphone cómo establecer el valor predeterminado de una propiedad

#import <UIKit/UIKit.h> 

@interface CalcViewController : UIViewController { 
    NSNumber* result; 
    NSString* input; 
    //NSString* input = @""; 

    IBOutlet UITextField* display; 
} 

@property (retain) NSNumber* result; 
@property (retain) NSString* input; 
@property (nonatomic, retain) UITextField* display; 

@end 

El problema es que quiero añadir una cadena a la entrada, pero esto no es posible cuando aún es nulo. Es por eso que quiero establecer el valor predeterminado de entrada para ser @ "". Pero, ¿dónde pongo este código?

Conozco una posible solución donde la colocas en un constructor predeterminado. Pero no tengo idea en qué archivo poner esto. Y de donde debería llamarlo.

Desafortunadamente, tengo una comprensión limitada de C y me doy cuenta de que tal vez un archivo .h no es el correcto.

El tipo de proyecto es una aplicación basada en vista si lo necesita.

Espero que pueda ayudar.

Respuesta

16

Puede que le resulte útil leer alguna documentación sobre Objective-C o Cocoa. Probablemente pueda encontrar algunas buenas sugerencias sobre material de lectura si realiza una búsqueda aquí en StackOverflow o en Google.

Para responder a su pregunta, debe tener @implementation de CalcViewController. Uno muy a menudo colocaría esta @implementación dentro del archivo * .m. Si su archivo * .h se llama "ViewController.h", la implementación entraría en "ViewController.m".

Luego crearía una copia de la función de inicialización del UIViewController y la colocaría allí (no sé cuál es la función init predeterminada).

Por ejemplo:

@implementation CalcViewController 

@synthesize result; 
@synthesize input; 

- (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle 
{ 
    self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController's version of init 
    if (self) { 
     input = [[NSString alloc] initWithString:@""]; // You should create a new string as you'll want to release this in your dealloc 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [input release]; 
    [super dealloc]; 
} 
@end // end of the @implementation of CalcViewController 

NOTAS:

  • Es posible que desee cambiar el nombre del archivo a CalcViewController. Creo que es más fácil para el motor de refactorización de Xcode.
  • No necesita declarar @property para la variable de instancia de visualización cuando la conecta con Interface Builder. A menos que usted desea que los clientes de la CalcViewController para cambiar a menudo

EDIT: 28 de abril de 2009: 10:20 AM EST: Sugiero realidad la asignación de un NSString como usted debe técnicamente liberarlo en el dealloc.

EDIT: 28 de abril de 2009: 11:11 AM EST: Actualicé @implementation para usar la versión de init de UIViewController.

+0

respuesta a la nota que es un archivo de CalcViewController acabo de conocer que es un ViewController . Y sí, la pantalla debe cambiar a menudo. Gracias – MrHus

+0

Para que quede claro, cuando escribí sobre la variable de instancia de visualización cambiando a menudo, me refiero a la * instancia * real de la variable. No los datos reales en el objeto de visualización. Entonces, si puedes imaginar que vas a destruir y volver a crear la variable de instancia de visualización, entonces esto tendría sentido. –

+0

Ok, me daré cuenta de cómo cambiar la pantalla sin una variable. Pero - (id) init no se llama. ¿Alguna razón por qué? – MrHus

3

Otra opción es escribir su propio captador para su propiedad de entrada, y devolver @ "" si la variable de instancia es nula. Esto funcionaría incluso si asigna accidentalmente o intencionalmente nil a la entrada, mientras que usar init para establecer un valor predeterminado se rompería.

+0

Una buena solución, pero no es una práctica común. Es probable que otros lectores de su código busquen en el inicializador designado el valor predeterminado. –

+1

No diría eso, devolver un objeto vacío en lugar de cero es bastante común en Cocoa. Eso no quiere decir que establecerlo en init sea malo o algo así, es más una cuestión de preferencia. –

9

Muy buena pregunta. La respuesta corta es iniciar los valores en la función init. Debe sobrescribir la función de inicio predeterminada para que el valor predeterminado esté listo antes de poder usar el objeto. Me gustaría sugerir que las personas dejen de sugerir a otros que lean el documento; por favor responda la pregunta directamente si puede.

+4

Las personas que dicen "bla, bla, bla, tal vez deberías leer los documentos" deberían ser azotadas, condenadas al ostracismo y odiadas. son tontos. –

+0

Voto ascendente alex gay todo el SO porque estoy de acuerdo con este sentimiento tanto. –

+4

Quiero decir, alex gris –

0

La manera más obvia para poner en práctica sería como siguiente:

  1. En el archivo viewcontroller.m, reemplazar el método init por defecto. Este método se llama cada vez que se inicializa un controlador de vista. Entonces, es la mejor manera de inicializar su variable.

    - (id)initWithNibName:(NSString*)aNibName bundle:(NSBundle*)aBundle { 
        self = [super initWithNibName:aNibName bundle:aBundle]; // The UIViewController's  version of init 
        if (self) { 
         varName = [[NSString alloc] initWithString:@""]; 
        } 
        return self; 
    } 
    
  2. Ahora, dondequiera en su código que desea añadir una cadena a su cadena original, basta con utilizar: varName = [NSString stringwithformat:@"%@%@", varName, newString];

Cuestiones relacionadas