Comportamiento de la ventana emergente de la interfaz de usuario

Tengo una vista emergente (de una calculadora) que se presenta cada vez que se comienza a editar un campo de texto. El código donde se llama al método de visualización y el método de visualización en sí se publican a continuación.

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    //the background color may have been yellow if someone tried to submit the form with a blank field
    textField.backgroundColor = [UIColor whiteColor];

    sender = @"text field";

    [self displayCalculator:textField.frame];

    return YES;
}

El método que muestra la vista es:

-(IBAction)displayCalculator:(CGRect)rect{

    calculator = [[CalculatorViewController alloc] initWithNibName:@"CalculatorViewController" bundle:nil];
    popoverController = [[[UIPopoverController alloc] initWithContentViewController:calculator] retain];

    [popoverController setPopoverContentSize:CGSizeMake(273.0f, 100.0f)];

    [popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

}

Mis preguntas son las siguientes:

1) ¿Cómo puedo hacer que el popover se quede? Me gustaría que el usuario pudiera hacer clic en el campo de texto (el campo de texto que presentó la ventana emergente en primer lugar), pero cuando lo hace, la ventana emergente desaparece.

2) La ventana emergente a veces aparece de tal manera que bloquea el campo de texto, ¿hay alguna forma de que pueda controlar dónde aparece la ventana emergente? Actualmente estoy pasando el marco del campo de texto, pero parece que no funciona.

preguntado el 27 de julio de 12 a las 21:07

2 Respuestas

Siempre es bueno consultar los documentos para ver si hay métodos o propiedades que aborden una tarea o función necesaria (IUPoverController)

Parece que para su primer número debería echar un vistazo a la passthroughViews propiedad:

passthroughViews

Una matriz de vistas con las que el usuario puede interactuar mientras la ventana emergente está visible. @property (nonatomic, copy) NSArray *passthroughViews Discusión

Cuando un popover está activo, las interacciones con otras vistas normalmente se deshabilitan hasta que se descarta el popover. La asignación de una matriz de vistas a esta propiedad permite que las vistas correspondientes controlen los toques fuera de la ventana emergente.

Para el segundo problema (que cubre el área de texto), puede compensar textField.frame para definir un nuevo CGRect para que popoverController lo use como ancla.

CGRect targetRect = CGRectOffset(textField.frame, n, n);

Respondido el 03 de Septiembre de 12 a las 12:09

(Problema 1) En su método displayCalculator, debe tener una forma de verificar si la ventana emergente ya se está mostrando. A partir de ahora, cada vez que se actualice textField, volverá a dibujar la ventana emergente. Lo hiciste para cambiar la llamada textFieldDelegate a textFieldDidBeginEditing.

Prueba esto:

-(BOOL)textFieldDidBeginEditing:(UITextField *)textField {

    //the background color may have been yellow if someone tried to submit the form with a blank field
    textField.backgroundColor = [UIColor whiteColor];

    sender = @"text field";

    [self displayCalculator:textField.frame];

    return YES;
}

-(IBAction)displayCalculator:(CGRect)rect{

//We don't want to continually create a new instance of popoverController. So only if it is nil we create one. 
if (popoverController == nil)
    calculator = [[CalculatorViewController alloc] initWithNibName:@"CalculatorViewController" bundle:nil];
    popoverController = [[[UIPopoverController alloc] initWithContentViewController:calculator] retain];

    [popoverController setPopoverContentSize:CGSizeMake(273.0f, 100.0f)];
}

//Check to make sure it isn't already showing. If it's not, then we show it. 
if (!popoverController.popoverVisible) {
    [popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

}

EDITAR

Como señaló flaco (debería haber mencionado). El popover se descartará cada vez que toques fuera de él. Es por eso que textFieldDelegate se cambió a textFieldDidBeginEditing.

Aquí hay un buen tutorial que podría ser de ayuda.

Si todo lo demás falla, simplemente cree su propio popover.

Respondido 27 Jul 12, 22:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.