Criando um UISwitch programaticamente
-
19-09-2019 - |
Pergunta
Em um esforço aparentemente interminável para aprender mais sobre o desenvolvimento do iPhone, eu tenho jogado ao redor com algum do código fonte disponível através do site maçãs desenvolvedor. O exemplo particular, eu estou trabalhando com é Core Data Books, encontrada aqui . O DetailViewController, eo AddViewController são feitas através de programação, porque não há nenhum arquivo xib para eles. A minha pergunta é sobre a adição programaticamente as coisas para uma visão sem o uso de IB. Eu quero colocar um UISwitch sob o UITableView que contém as informações detalhadas sobre um determinado livro na DetailView. Como eu faço isso? Isto é o que eu tentei até agora:
Na configuração AddViewController, eu o UISwitch:
@interface AddViewController : DetailViewController {
id <AddViewControllerDelegate> delegate;
UISwitch *onoff;
}
@property (nonatomic, assign) id <AddViewControllerDelegate> delegate;
@property (nonatomic, retain) IBOutlet UISwitch *onoff;
Eu também configurar uma IBAction:
- (IBAction)flip:(id)sender;
Então eu sintetizá-lo no arquivo AddViewController.m, mas nada acontece. Eu só preciso de configurar a chave e torná-lo para que eu possa controlar o que ele faz de minha IBAction que a instalação I. Eu sei que isto é embaraçosamente simples, mas eu não consigo entender. Então, qualquer ajuda seria apreciada! Graças
Editar 1
Então, eu implementei o código como I foi dirigido no viewDidLoad, assim:
- (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];
E ele lança duas advertências dizendo que a declaração de local do 'onoff' esconde a variável de instância. Mas mesmo que haja esses ganhos, o UISwitch aparece muito bem, mas quando eu movê-lo ou usá-lo, ele não se parece com ele está funcionando plenamente. Para minha ação parecida com esta:
- (IBAction)flip:(id)sender {
if (onoff.on) NSLog(@"On");
else NSLog(@"Off");
}
Sempre que o interruptor está ligado, o console deve ler, e quando o seu fora, o console deve ler off. Certo? Sempre que eu movê-lo, ele apenas repete no console, off. Se a sua, ou se o seu fora, ele só mostra fora. O que no mundo que eu estou fazendo errado? Por favor ajude! Graças
Solução
O compilador está tentando ajudá-lo. Você está substituindo a variável de instância onoff em sua viewDidLoad;
assim, isso nunca ficando set. Em sua -flip: método, você está fazendo referência a um controlador nulo. Há duas maneiras de corrigir isto:
(a) Livrar-se da declaração de local do onoff, e usar apenas sua instância variável
(b) Elenco do argumento remetente para -flip: como um UISwitch
e acesso que:
- (IBAction) flip: (id) sender {
UISwitch *onoff = (UISwitch *) sender;
NSLog(@"%@", onoff.on ? @"On" : @"Off");
}
Outras dicas
Steve, me desculpe se eu não entendi sua pergunta. Será que você realmente criar o UISwitch
e adicioná-lo à hierarquia vista? -loadView
ou -viewDidLoad
implementação do seu controlador deve ter um código como o seguinte:
// 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];