Dos uipopovers en una vista
-
28-10-2019 - |
Pregunta
Estoy tratando de poner dos UIPopovers diferentes en una vista. Soy bastante nuevo en Objective-C, y en la programación en general, por lo que en lugar de hacer el método inteligente y eficiente de tener un popover y cambiar su contenido dependiendo de cómo se llama, solo usé el método estúpido y simple de crear Dos vistas, dos delegados, dos popovers, etc. No sé si es por eso que tengo un problema, o si es por alguna otra razón.
Así que aquí está el problema. En el viewdidload
de la vista donde aparecen los popoveres, tengo este código:
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];
}
Obviamente optionsViewController
es el VC que aparece dentro de Popover 1 (con el controlador Popover llamado "PopoverController"), y newCurrencyViewController
es el VC que aparece dentro de Popover 2 (con el controlador Popover llamado "newCurrencyPopoverController
").
Cada vez que se carga la vista, la aplicación se bloquea con un SIGABRT
error, y la consola dice:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIPopoverController initWithContentViewController:] must not be called with `nil`.'
Además, hay una advertencia que dice "Método de instancia: Alloc no encontrado (Tipo de retorno predeterminado a ID)" para la línea que
saysnewCurrencyViewController =[[newCurrencyViewController alloc]init];
Mi primer pensamiento fue que había mal escrito el nombre de un archivo en algún lugar, ya que creo que el problema es que no está encontrando el archivo llamado NewcurrencyPoPoverController, pero he revisado todo y no puedo encontrar ninguna mala mala información ni nada. ¿Algunas ideas?
¡Muchas gracias!
Luque
Solución
Estás llamando métodos alloc
+ init
de tu variable newCurrencyViewController
¡Pero debes llamarlos a la clase de esa variable!
Línea con error:
newCurrencyViewController =[[newCurrencyViewController alloc]init];
El resultado de esta línea será newCurrencyViewController == nil
. Y cuando intentes iniciar UIPopoverController
Con esa vista se bloqueará como describiste.
Si variable newCurrencyViewController
es de clase, por ejemplo, CurrencyViewController
Entonces debe reemplazar esa línea con esta:
newCurrencyViewController =[[CurrencyViewController alloc] init];
Otros consejos
No tiene un objeto para llamar a Alloc e init cuando llame a 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];
}
Probablemente quieras algo más como
newCurrencyViewController = [[UICurrencyViewController alloc] init];
O con el nombre de su controlador de vista personalizado es