Deux UIPopovers en une seule vue
-
28-10-2019 - |
Question
J'essaie de mettre deux UIPopovers différents dans une seule vue. Je suis assez nouveau dans l'objectif-c et la programmation en général, donc au lieu de faire la méthode intelligente et efficace d'avoir un popover et de changer son contenu en fonction de la façon dont il est appelé, j'ai juste utilisé la méthode stupide et simple de simplement créer deux vues, deux délégués, deux popovers etc ... Je ne sais pas si c'est pour ça que j'ai un problème, ou si c'est pour une autre raison.
Voici donc le problème. Dans le viewdidload
de la vue où apparaissent les popovers, j'ai ce code:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
optionsViewController =[[OptionsViewController alloc]init];
optionsViewController.delegate = self;
popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
popoverController.popoverContentSize = CGSizeMake(320, 216);
[popoverController setDelegate:self];
newCurrencyViewController =[[newCurrencyViewController alloc]init];
newCurrencyViewController.delegate = self;
newCurrencyPopoverController = [[UIPopoverController alloc] initWithContentViewController:newCurrencyViewController];
newCurrencyPopoverController.popoverContentSize = CGSizeMake(320, 216);
[newCurrencyPopoverController setDelegate:self];
}
De toute évidence, optionsViewController
est le vc qui apparaît à l'intérieur du popover 1 (avec le contrôleur popover appelé "popoverController"), et newCurrencyViewController
est le vc qui apparaît à l'intérieur du popover 2 (avec le contrôleur popover appelé "newCurrencyPopoverController
").
Chaque fois que la vue se charge, l'application se bloque avec une erreur SIGABRT
, et la console dit:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIPopoverController initWithContentViewController:] must not be called with `nil`.'
saysnewCurrencyViewController =[[newCurrencyViewController alloc]init];
Ma première pensée a été que j'avais mal orthographié le nom d'un fichier quelque part, car je pense que le problème est qu'il ne trouve pas le fichier appelé newCurrencyPopoverController, mais j'ai tout vérifié et je ne trouve aucune faute d'orthographe ou quoi que ce soit . Des idées?
Merci beaucoup!
LUKE
La solution
Vous appelez les méthodes alloc
+ init
de votre variable newCurrencyViewController
mais vous devriez les appeler dans la classe de cette variable!
Ligne avec bug:
newCurrencyViewController =[[newCurrencyViewController alloc]init];
Le résultat de cette ligne sera newCurrencyViewController == nil
.Et lorsque vous essaierez d'initier UIPopoverController
avec cette vue, il plantera comme vous l'avez décrit.
Si la variable newCurrencyViewController
est de classe, par exemple CurrencyViewController
, vous devez remplacer cette ligne par celle-ci:
newCurrencyViewController =[[CurrencyViewController alloc] init];
Autres conseils
vous n'avez pas d'objet sur lequel appeler alloc et init lorsque vous appelez newCurrenceViewController.
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
optionsViewController =[[OptionsViewController alloc]init];
optionsViewController.delegate = self;
popoverController = [[UIPopoverController alloc] initWithContentViewController:optionsViewController];
popoverController.popoverContentSize = CGSizeMake(320, 216);
[popoverController setDelegate:self];
//Here is your problem---------------------------------------------
newCurrencyViewController =[[newCurrencyViewController alloc]init];
//-----------------------------------------------------------------
newCurrencyViewController.delegate = self;
newCurrencyPopoverController = [[UIPopoverController alloc] initWithContentViewController:newCurrencyViewController];
newCurrencyPopoverController.popoverContentSize = CGSizeMake(320, 216);
[newCurrencyPopoverController setDelegate:self];
}
vous voulez probablement quelque chose de plus comme
newCurrencyViewController = [[UICurrencyViewController alloc] init];
Ou w / e le nom de votre contrôleur de vue personnalisé est