iphone - Creando un UISwitch programáticamente
objective-c uiview (2)
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 apple. El ejemplo particular con el que estoy trabajando es Core Data Books, que se encuentra here . El DetailViewController y el AddViewController se hacen mediante programación, porque no hay ningún archivo xib para ellos. Mi pregunta es acerca de agregar cosas a una vista programáticamente sin usar IB. Quiero poner un UISwitch debajo de UITableView que tenga la información detallada sobre un libro en particular en DetailView. ¿Cómo hago esto? Esto es lo que he intentado hasta ahora:
En el AddViewController, configuro el interruptor UIS:
@interface AddViewController : DetailViewController {
id <AddViewControllerDelegate> delegate;
UISwitch *onoff;
}
@property (nonatomic, assign) id <AddViewControllerDelegate> delegate;
@property (nonatomic, retain) IBOutlet UISwitch *onoff;
También configuro un IBAction:
- (IBAction)flip:(id)sender;
Luego lo sintetizo en el archivo AddViewController.m, pero no pasa nada. Solo necesito configurar el interruptor y hacerlo para que pueda controlar lo que hace desde mi IBAction que configuro. Sé que esto es vergonzosamente simple, pero no puedo entenderlo. ¡Por lo que cualquier ayuda se agradece! Gracias
Editar 1
Así que implementé el código tal como me indicaron en 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 ''onoff'' oculta la variable de instancia. Pero a pesar de que existen esas ganancias, el UISwitch aparece muy bien, pero cuando lo muevo o lo uso, no parece que esté funcionando completamente. Para mi acción que se ve así:
- (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 está apagado, la consola debe leer apagado. ¿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é diablos estoy haciendo mal? ¡Por favor ayuda! Gracias
El compilador está tratando de ayudarte. Estás anulando la variable de instancia onoff en tu viewDidLoad;
Por lo tanto, eso nunca se establece. En su método -flip: está haciendo referencia a un controlador nulo. Hay dos formas de solucionar esto:
(a) Deshágase de la declaración local de onoff, y simplemente use su variable de instancia
(b) Envíe el argumento del remitente a -flip: como un UISwitch
, y acceda a eso:
- (IBAction) flip: (id) sender {
UISwitch *onoff = (UISwitch *) sender;
NSLog(@"%@", onoff.on ? @"On" : @"Off");
}
Steve, lo siento si entendí mal tu pregunta. ¿ UISwitch
realmente UISwitch
y lo agregó a la jerarquía de vistas? La implementación -loadView
o -viewDidLoad
su controlador 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];