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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top