2010-01-08 14 views
29

En un esfuerzo aparentemente interminable para aprender más sobre el desarrollo de iphone, he estado jugando con algunos de los códigos fuente disponibles a través del sitio web de desarrolladores de manzanas. El ejemplo particular con el que estoy trabajando es Core Data Books, encontrado here. DetailViewController y AddViewController se crean programáticamente, porque no hay ningún archivo xib para ellos. Mi pregunta es acerca de agregar programáticamente cosas a una vista sin usar IB. Quiero poner un UISwitch debajo de UITableView que tiene la información detallada sobre un libro en particular en el DetailView. ¿Cómo hago esto? Esto es lo que he probado hasta ahora:Creando un UISwitch programáticamente

En el AddViewController, I fijó la UISwitch:

@interface AddViewController : DetailViewController { 
id <AddViewControllerDelegate> delegate; 
UISwitch *onoff; 

} 

@property (nonatomic, assign) id <AddViewControllerDelegate> delegate; 
@property (nonatomic, retain) IBOutlet UISwitch *onoff; 

también configurar una IBAction:

- (IBAction)flip:(id)sender; 

Entonces sintetizarlo en el AddViewController. m archivo, pero no pasa nada. Solo necesito configurar el interruptor y hacerlo para poder controlar lo que hace desde mi IBAction que configuro. Sé que esto es vergonzosamente simple, pero no puedo resolverlo. ¡Por lo que cualquier ayuda se agradece! Gracias

Editar 1

Así que implementa el código como me dirigieron a la viewDidLoad, así:

- (void)viewDidLoad { 

[super viewDidLoad];  
    UISwitch *onoff = [[UISwitch alloc] initWithFrame: CGRectZero]; 
[onoff addTarget: self action: @selector(flip:) forControlEvents:UIControlEventValueChanged]; 
// Set the desired frame location of onoff here 
[self.view addSubview: onoff]; 

Y lanza dos advertencias que dicen que la declaración local de cueros 'OnOff' la variable de instancia. Pero a pesar de que hay esas ganancias, el UISwitch aparece bien, pero cuando lo muevo o lo uso, parece que no está funcionando del todo. Para mi acción que tiene este aspecto:

- (IBAction)flip:(id)sender { 
if (onoff.on) NSLog(@"On"); 
else NSLog(@"Off"); 
} 

Cada vez que el interruptor está encendido, la consola debe leer, y cuando su apagado, la consola debe leer fuera. ¿Derecha? Cada vez que lo muevo, simplemente se repite en la consola, apagado. Si está encendido, o si está apagado, solo se muestra apagado. ¿Qué demonios estoy haciendo mal? ¡Por favor ayuda! Gracias

+0

¿Por qué no utilizar IB? Y si no lo está utilizando, ¿por qué las cosas se declaran como IBOutlet e IBAction? – gerry3

+0

Wow. Gran punto De hecho, me encantaría usar IB, pero como mencioné, estoy intentando que esto funcione en una vista que no utiliza IB. ¿Hay alguna manera fácil de agregar un archivo xib a una pantalla que está completando una vista única y mostrando celdas de información? Gracias – Steve

Respuesta

29

El compilador está tratando de ayudarte. Está anulando la variable de instancia onoff en su viewDidLoad; por lo tanto, eso nunca se establece. En tu método -flip: estás haciendo referencia a un controlador nulo. Hay dos maneras de solucionar este problema:

(a) Se puede olvidarse de la declaración local de onoff, y sólo tiene que utilizar su instancia de variable

(b) Reparto de la discusión remitente a -flip: como UISwitch, y acceda a eso:

- (IBAction) flip: (id) sender { 
    UISwitch *onoff = (UISwitch *) sender; 
    NSLog(@"%@", onoff.on ? @"On" : @"Off"); 
} 
+0

Gracias! Eso solucionó mi problema. – Steve

16

Steve, lo siento si malinterpreté su pregunta. ¿Creó realmente el UISwitch y lo agregó a la jerarquía de vistas? de su controlador -loadView o -viewDidLoad aplicación debe tener un código como el siguiente:

// Use the ivar here 
onoff = [[UISwitch alloc] initWithFrame: CGRectZero]; 
[onoff addTarget: self action: @selector(flip:) forControlEvents: UIControlEventValueChanged]; 
// Set the desired frame location of onoff here 
[self.view addSubview: onoff]; 
[onoff release]; 
+0

Hola muchas gracias por su ayuda. Hizo aparecer el UISwitch, ¡lo cual es genial!Pero parece que no está funcionando del todo, consulte mi edición anterior para obtener el código. Gracias – Steve

+0

Perdón por el estúpido error. Lo he arreglado (ver los comentarios de Ben Gottlieb). – Costique

+0

¡Esa fue una respuesta maravillosa, que mucho @Costique! – cvursache