Pregunta

Normalmente he estado pasando alrededor de la variable en los métodos de arranque, pero no puedo hacer que esta vez porque tengo una var en una clase ViewController visualiza mediante una barra de pestañas y necesito acceso a la misma de una clase diferente cuando ViewController se presiona una barra de pestañas diferentes. Mi entendimiento es que se puede acceder mediante VARs @property pero ahora se está trabajando, así que estoy haciendo algo mal. Aquí es lo que tengo:

Class 1 Header file

@interface DailyViewController : UIViewController <UIActionSheetDelegate> {

NSDate *today;

}

@property (readwrite, nonatomic, retain) NSDate *today;



Class 2 implementation file:


- (void)viewWillAppear:(BOOL)animated{

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
DailyViewController *otherClass = [[DailyViewController alloc] init];   

NSString* todayString = [formatter stringFromDate:otherClass.today];
r_todayLabel.text = todayString;
[otherClass release];
[formatter release];

}

¿Fue útil?

Solución

Es necesario recuperar el DailyViewController * objeto de su AppDelegate (o donde se almacena), y recuperar la fecha de la misma.

Usted está creando un nuevo DailyViewController * objeto, no inicializarlo con su fecha, y luego acceder a su campo de fecha (que será nula por defecto).

Algo así como

MyAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
DailyViewController *otherClass = appDelegate.dailyViewController;
NSDate* dailyViewToday = otherClass.today;

Sin embargo todo lo que está violando un montón de reglas de la buena programación.

En primer lugar, usted debe apuntar para MVC (Modelo Vista Controlador), por lo que su "hoy" fecha debe ser almacenado en su modelo. A continuación, ambas clases podrían acceder hoy a partir del modelo en lugar de desde el controlador de una vista y entonces no habría necesidad de la clase 2 para acceder a la DailyViewController en absoluto y por lo que no hay necesidad de almacenar una referencia a él en el AppDelegate, que es una mala idea ya que no tiene nada que ver con la delegación para el UIApplication y en realidad es sólo una variable global en el encubrimiento.

Otros consejos

Sin tener

@synthesize today;

en el archivo "Class1.m", no se crean los métodos get y set para hoy. Esto significa que su propiedad no puede ser cambiado o visible desde el exterior.

En el archivo de origen "Class1.m" ¿tiene

@synthesize today;

Es necesario inicializar hoy, por ejemplo en el constructor de DailyViewController agregar lo siguiente:

self.today = [NSDate date];

Al analizar la respuesta de Pedro ( "En primer lugar, usted debe apuntar para MVC (Modelo Vista Controlador), por lo que su 'hoy' fecha debe ser almacenado en su modelo. Entonces ambas clases pueden acceder hoy a partir del modelo en lugar de uno el controlador de vista y entonces no habría necesidad para la clase 2 para acceder a la DailyViewController en absoluto y por lo que no hay necesidad de almacenar una referencia a él en el AppDelegate, que es una mala idea, ya que no tiene nada que ver con la delegación a la UIApplication y es en realidad sólo una variable global en el encubrimiento. "), tengo una pregunta.

¿Cómo hacer las dos clases de acceso al modelo? Sería la llamada init para cada controlador de vista puede pasar en un puntero al modelo? (Es decir, la AppDelegate crea el objeto de modelo, a continuación, pasa el puntero para cada uno de los métodos de inicialización del controlador de vista?)

Sal

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top