web-dev-qa-db-fra.com

Création d'un UISwitch par programme

Dans un effort apparemment sans fin pour en savoir plus sur le développement de l'iphone, j'ai joué avec une partie du code source disponible sur le site Web des développeurs de pommes. L'exemple particulier avec lequel je travaille est Core Data Books, trouvé ici . Le DetailViewController et le AddViewController sont créés par programme, car il n'y a aucun fichier xib pour eux. Ma question concerne l'ajout par programme de choses à une vue sans utiliser IB. Je veux placer un UISwitch sous UITableView qui contient les informations détaillées sur un livre particulier dans DetailView. Comment puis-je faire cela? Voici ce que j'ai essayé jusqu'à présent:

Dans AddViewController, j'ai configuré UISwitch:

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

 }

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

J'ai également configuré une IBAction:

- (IBAction)flip:(id)sender;

Ensuite, je le synthétise dans le fichier AddViewController.m, mais rien ne se passe. J'ai juste besoin de configurer le commutateur et de le faire pour pouvoir contrôler ce qu'il fait à partir de mon IBAction que j'ai configuré. Je sais que c'est d'une simplicité embarrassante, mais je ne peux pas le comprendre. Donc, toute aide serait appréciée! Merci

Modifier 1

J'ai donc implémenté le code comme indiqué dans le viewDidLoad, comme ceci:

   - (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];

Et il lance deux avertissements indiquant que la déclaration locale de "onoff" cache la variable d'instance. Mais même s'il y a ces gains, l'UISwitch apparaît très bien, mais quand je le déplace ou l'utilise, il ne semble pas qu'il fonctionne pleinement. Pour mon action qui ressemble à ceci:

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

Chaque fois que l'interrupteur est activé, la console doit continuer à lire et lorsqu'elle est désactivée, la console doit lire. Droite? Chaque fois que je le déplace, il se répète simplement dans la console, éteint. S'il est activé ou désactivé, il ne fait que s'afficher. Qu'est-ce que je fais mal au monde? Aidez-moi! Merci

29
Steve

Le compilateur essaie de vous aider. Vous remplacez la variable d'instance onoff dans votre viewDidLoad; ainsi, ce n'est jamais réglé. Dans votre méthode -flip:, vous faites référence à un contrôleur nul. Il existe deux façons de résoudre ce problème:

(a) Débarrassez-vous de la déclaration locale de onoff, et utilisez simplement votre variable d'instance

(b) Convertissez l'argument sender en -flip: en tant que UISwitch, et accédez à ce qui suit:

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

Steve, je suis désolé si j'ai mal compris votre question. Avez-vous réellement créé le UISwitch et l'ajoutez à la hiérarchie des vues? Votre contrôleur -loadView ou -viewDidLoad l'implémentation doit avoir un code comme celui-ci:

// 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];
16
Costique