2011-02-20 8 views
9

estoy usando un UIDatePicker en una vista modal, para seleccionar una fecha. He descubierto que si se cierra la vista, mientras que el selector de fecha sigue rodando, tengo una EXC_BAD_ACCESS.¿Detecta si UIDatePicker está en funcionamiento?

¿Cómo puedo detectar I del selector de fecha está rodando cuando la lengüeta usuario un botón?

tenía dos ideas:

1) detectar si el valor ha cambiado con esta:

[myDatePicker addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged]; 

Pero tendría que ser capaz de detectar si el valor cambiará.

2) comprobar si la fecha es válida, pero cuando el selector de fechas está rodando, se devuelve la fecha anterior, y por supuesto es válido.

¿Alguna idea?

+0

No creo que sea posible obtener los eventos de desplazamiento de un ' UIPickerView' o un 'UIDatePicker'. –

+2

El selector de fecha (y la vista del selector) no proporcionan una forma de saber si uno de los componentes se está moviendo. –

Respuesta

11

Para evitar este bloqueo, no es necesario que trate de predecir cuándo el selector intentará enviar una llamada de método de acción a su clase, en su lugar, simplemente elimine la acción de evento del selector en la rutina dealloc de ViewController.

EDIT: ¡Uy, como se señaló en un comentario, el UIDatePicker no tiene un delegado. Pero puedes asignarle eventos de acción. Entonces, en su lugar, cualquier acción establecida apuntando al objeto que se está tratando debe ser eliminada.

- (void dealloc 
{ 
    [myPicker removeTarget:self action:... forControlEvents:...]; 
    [myPicker release]; 
    [super dealloc]; 
} 
+2

'UIDatePicker' no tiene un delegado. –

+0

gracias por la corrección! – Bogatyr

0

Oficialmente, no se puede recuperar el estado del selector en estos términos con sólo UIDatePicker métodos oficiales de Apple.

Si hay soluciones por ahí, sin embargo, tengo curiosidad de verlos.

4

Yo sé que soy bastante tarde, pero sólo he creado una costumbre subclase UIDatePicker con un delegado:

Este es el delegado:

// In TDDatePickerDelegate.h 

#import <Foundation/Foundation.h> 
#import "TDDatePicker.h" 

@class TDDatePicker; 
@protocol TDDatePickerDelegate 

@required 
- (void)datePickerChanged:(TDDatePicker *)datePicker newDate:(NSDate *)newDate; 

@end 

y esta es la subclase

// In TDDatePicker.h 

#import <UIKit/UIKit.h> 

#import "TDDatePickerDelegate.h" 
@interface TDDatePicker : UIDatePicker 

- (void)setHidden:(BOOL)hidden animated:(BOOL)animated; 
- (void)dateChanged; 

@property (nonatomic, assign) IBOutlet id <TDDatePickerDelegate> delegate; 

@end 



// In TDDatePicker.m 

#import "TDDatePicker.h" 

@implementation TDDatePicker 

@synthesize delegate; 

- (id)init { 
    self = [super init]; 
    if (self) { 
    [self addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged]; 
} 
return self; 
} 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged]; 
    } 
    return self; 
} 
- (void)dateChanged { 
    [delegate datePickerChanged:self newDate:self.date]; 
} 

- (void)dealloc { 
    [self removeTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged]; 
} 

@end 
+0

Esto es lo que quería una subclase. ¡Gracias! –

1

Objetivo-C:

[datePicker addTarget:self action:@selector(isRolled) forControlEvents:UIControlEventValueChanged]; 

- (void)isRolled { 
    NSLog(@"Date Picker has been rolled."); 
} 

Swift:

datePicker.addTarget(self, action: "isRolled", forControlEvents: .ValueChanged) 

func isRolled() { 
    print("Date Picker has been rolled.") 
} 
0

Hay un truco para detectar esto, pero no hay un método delegado/propiedad para detectar si su desplazamiento o no

  1. toman una propiedad como isScrolling
  2. set isScrolling a true en func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? o método equivalente
  3. set isScrolling a true en func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
  4. activar el botón de cierre de vista modal sólo si selector ha llegado a un estado finito que se desplaza está desactivado esperanza

esto ayuda

Cuestiones relacionadas