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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top