Due Uipopovers in una vista
-
28-10-2019 - |
Domanda
Sto cercando di mettere due diversi UIpopovers in una vista. Sono abbastanza nuovo per Objective-C e programmazione in generale, quindi invece di fare il metodo intelligente ed efficiente per avere un popolo e cambiare il contenuto a seconda di come viene chiamato, ho appena usato lo stupido e semplice metodo per creare Due visualizzazioni, due delegati, due popover ecc ... Non so se è per questo che ho un problema o se è per qualche altro motivo.
Quindi ecco il problema. Nel viewdidload
Della vista in cui compaiono i popovers, ho questo codice:
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];
}
Ovviamente optionsViewController
è il VC che appare all'interno di Popover 1 (con il controller di popover chiamato "PopoverController") e newCurrencyViewController
è il VC che appare all'interno di Popover 2 (con il controller Popover chiamato "newCurrencyPopoverController
").
Ogni volta che la vista si carica, l'app si blocca con a SIGABRT
errore e la console dice:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIPopoverController initWithContentViewController:] must not be called with `nil`.'
Inoltre, c'è un avvertimento che dice "Metodo di istanza -Alloc non trovato (tipo di restituzione predefinito su ID)" per la riga che quella
saysnewCurrencyViewController =[[newCurrencyViewController alloc]init];
Il mio primo pensiero è stato che avessi scritto male il nome di un file da qualche parte, dal momento che penso che il problema sia che non sta trovando il file chiamato NewCururnIpopoverController, ma ho controllato tutto e non riesco a trovare errori di errore o altro. Qualche idea?
Grazie mille!
Luca
Soluzione
Stai chiamando metodi alloc
+ init
della tua variabile newCurrencyViewController
Ma dovresti chiamarli alla classe di quella variabile!
Linea con bug:
newCurrencyViewController =[[newCurrencyViewController alloc]init];
Il risultato di questa linea sarà newCurrencyViewController == nil
. E quando proverai a iniziare UIPopoverController
Con questa visione si schianterà come hai descritto.
Se variabile newCurrencyViewController
è di classe, ad esempio, CurrencyViewController
Quindi dovresti sostituire quella linea con questa:
newCurrencyViewController =[[CurrencyViewController alloc] init];
Altri suggerimenti
Non hai un oggetto su cui chiamare Alloc e init quando chiami 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];
}
Probabilmente vuoi qualcosa di più simile
newCurrencyViewController = [[UICurrencyViewController alloc] init];
O w/e il nome del controller di visualizzazione personalizzato è