Aggiungi UIPickerView e un pulsante nel foglio delle azioni - Come?


120

La mia applicazione richiede che le seguenti cose siano aggiunte in un foglio di azione.

  • UIToolbar
  • Pulsante su UIToolbar
  • Controllo UIPicker

Ho incluso un'immagine per comprendere le mie esigenze.

testo alternativo

Potresti spiegare come può essere implementato?


3
Grazie per aver pubblicato questo interessante problema!
Tuyen Nguyen

Invece di scherzare con la gestione di actionSheet, pickerView, ecc., Consiglierei di usare EAActionSheetPicker . Pulisce davvero molto il tuo codice.
ebandersen

@eckyzero Sfortunatamente, l'EAActionSheetPicker sembra non funzionare in iOS 7, ci sono molti errori che iniziano tutti con "contesto non valido 0x0.".
Magnus

ovviamente è troppo bello per essere vero ... mi fottuto, sì ios b così difficile
ChuckKelly

EAActionSheetPicker non funziona più.
osxdirk

Risposte:


25

Aggiornamento per iOS 7

Documenti Apple per UIActionSheet :UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy

Raccomando di non tentare di personalizzare il contenuto di un ActionSheet, in quanto può portare a gravi errori di contesto non validi in iOS 7. Ho appena trascorso alcune ore a risolvere questo problema e alla fine ho deciso di adottare un approccio diverso. Ho sostituito la chiamata per mostrare il foglio delle azioni con un controller di visualizzazione modale contenente una semplice tableview.

Ci sono molti modi per farlo. Ecco un modo che ho appena implementato in un progetto in corso. È bello perché posso riutilizzarlo tra 5 o 6 schermate diverse in cui tutti gli utenti selezionano da un elenco di opzioni.

  1. Crea una nuova sottoclasse UITableViewController, SimpleTableViewController .
  2. Crea un UITableViewController nello storyboard (incorporato in un controller di navigazione) e imposta la sua classe personalizzata su SimpleTableViewController.
  3. Assegna al controller di navigazione per SimpleTableViewController un ID storyboard "SimpleTableVC".
  4. In SimpleTableViewController.h, crea una proprietà NSArray che rappresenterà i dati nella tabella.
  5. Anche in SimpleTableViewController.h, creare un protocollo SimpleTableViewControllerDelegatecon un metodo richiesto itemSelectedatRow:e una proprietà debole chiamata delegato di tipoid<SimpleTableViewControllerDelegate> . In questo modo restituiremo la selezione al controllore genitore.
  6. In SimpleTableViewController.m, implementare l'origine dati tableview e i metodi delegati, chiamando itemSelectedatRow:in tableView:didSelectRowAtIndexPath:.

Questo approccio ha l'ulteriore vantaggio di essere abbastanza riutilizzabile. Per utilizzarlo, importa la classe SimpleTableViewController in ViewController.h, conformati a SimpleTableViewDelegate e implementa il itemSelectedAtRow:metodo. Quindi, per aprire il modal basta creare un'istanza di un nuovo SimpleTableViewController, impostare i dati della tabella e delegare e presentarlo.

UINavigationController *navigationController = (UINavigationController *)[self.storyboard instantiateViewControllerWithIdentifier:@"SimpleTableVC"];
SimpleTableViewController *tableViewController = (SimpleTableViewController *)[[navigationController viewControllers] objectAtIndex:0];
tableViewController.tableData = self.statesArray;
tableViewController.navigationItem.title = @"States";
tableViewController.delegate = self;
[self presentViewController:navigationController animated:YES completion:nil];

Ho creato un semplice esempio e l' ho pubblicato su GitHub .

Vedere anche la visualizzazione del foglio delle azioni causa errori di contesto non valido CGContext .


2
Ahh iOS 7! Hai rovinato tutto ciò che è stato sviluppato fino ad ora. :(
Sagar R. Kothari

@Kyle Puoi espandere la tua risposta dicendo qual è stato il tuo approccio? Grazie
Daniel Sanchez

1
@DanielSanchez Aggiornato con un suggerimento alternativo e un esempio di codice.
Kyle Clegg

3
Una soluzione molto più elegante IMHO è impostare la visualizzazione di input del campo di testo su UIPickerView e il suo accessorio su UIToolbar. Puoi controllare il progetto QuickDialog per un esempio.
Steve Moser

111

Un'altra soluzione:

  • nessuna barra degli strumenti ma un controllo segmentato (eyecandy)

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil 
                                                        delegate:nil
                                                        cancelButtonTitle:nil
                                                        destructiveButtonTitle:nil
                                                        otherButtonTitles:nil];
    
    [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
    
    CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
    
    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;
    
    [actionSheet addSubview:pickerView];
    [pickerView release];
    
    UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Close"]];
    closeButton.momentary = YES; 
    closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
    closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
    closeButton.tintColor = [UIColor blackColor];
    [closeButton addTarget:self action:@selector(dismissActionSheet:) forControlEvents:UIControlEventValueChanged];
    [actionSheet addSubview:closeButton];
    [closeButton release];
    
    [actionSheet showInView:[[UIApplication sharedApplication] keyWindow]];
    
    [actionSheet setBounds:CGRectMake(0, 0, 320, 485)];

1
ricevo UIApplication potrebbe non rispondere all'avviso della finestra principale e l'applicazione si chiude.
Mahesh Babu

Sto cercando di utilizzare UIPickerView ma non sono stato in grado di integrarlo nella mia app. Voglio che UIPickerView venga visualizzato facendo clic su un pulsante la cui azione è registrata in MYViewController: UIViewController. Nel metodo di azione ho inserito il codice di pickerview sopra. cos'altro dovrei fare? Per favore aiuto.
Namratha

1
In realtà Fredrik, dovresti usare [[UIApplication sharedApplication] keyWindow]. Fonte modificata per cambiarlo.
Eric Goldberg

3
Van Du Tran - (void) dismissActionSheet: (UISegmentedControl *) sender {UIActionSheet actionSheet = (UIActionSheet ) [sender superview]; [actionSheet dismissWithClickedButtonIndex: 0 animated: YES]; }
WINSergey

1
Attenzione: questo causa molti errori CGContext in iOS 7. Vedi stackoverflow.com/questions/19129091/…
Kyle Clegg

75

Anche se questa domanda è vecchia, menzionerò rapidamente che ho creato una classe ActionSheetPicker con una funzione comoda, in modo da poter generare un ActionSheet con un UIPickerView in una riga. Si basa sul codice delle risposte a questa domanda.

Modifica: ora supporta anche l'uso di DatePicker e DistancePicker.


UPD:

Questa versione è deprecata: usa invece ActionSheetPicker-3.0 .

animazione


1
Super ... lo uso nella mia app.
Michael Morrison

Eccezionale. Lo sto usando adesso.
James Skidmore

@Sick devo aggiungere il tuo nome nel mio progetto se uso il tuo codice, grazie
vinothp

Ciao, sto usando questo corso nella mia app e funziona benissimo. Grazie. Ho una domanda. Nella ActionSheetDatePickermodalità, puoi aggiungere più pulsanti alla barra degli strumenti in alto. È possibile anche solo con il normale ActionSheetStringPicker?
Isuru

Può eseguire selezioni multiple?
Kyle Clegg

32

Sì! Finalmente lo trovo.

implementare il seguente codice sull'evento clic del pulsante, per far apparire il foglio di azione come indicato nell'immagine della domanda.

UIActionSheet *aac = [[UIActionSheet alloc] initWithTitle:@"How many?"
                                             delegate:self
                                    cancelButtonTitle:nil
                               destructiveButtonTitle:nil
                                    otherButtonTitles:nil];

UIDatePicker *theDatePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 44.0, 0.0, 0.0)];
if(IsDateSelected==YES)
{
    theDatePicker.datePickerMode = UIDatePickerModeDate;
    theDatePicker.maximumDate=[NSDate date];
}else {
    theDatePicker.datePickerMode = UIDatePickerModeTime;
}

self.dtpicker = theDatePicker;
[theDatePicker release];
[dtpicker addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];

pickerDateToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
pickerDateToolbar.barStyle = UIBarStyleBlackOpaque;
[pickerDateToolbar sizeToFit];

NSMutableArray *barItems = [[NSMutableArray alloc] init];

UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
[barItems addObject:flexSpace];

UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(DatePickerDoneClick)];
[barItems addObject:doneBtn];

[pickerDateToolbar setItems:barItems animated:YES];

[aac addSubview:pickerDateToolbar];
[aac addSubview:dtpicker];
[aac showInView:self.view];
[aac setBounds:CGRectMake(0,0,320, 464)];

ciao sagar, grazie per il codice, evento pulsante DatePickerDoneClick, come dichiararlo grazie
Apache

sagar, come chiudere il foglio delle azioni a comparsa e aggiungere il valore selezionato nel campo di testo grazie
Apache

[aac dimisswithclickedindex] // qualcosa di simile a questo metodo. (vedi Ho posizionato un pulsante Fine nel foglio delle azioni e aggiungi l'obiettivo del pulsante Fine - selettore e nel selettore posiziona il codice dimissale.
Sagar R. Kothari

grazie per la risposta sagar, aggiungo [aac dismissWithClickedButtonIndex]; ma ricevo un avviso: "UIActionSheet" potrebbe non rispondere a "-dismissWithClickedButtonIndex", quindi creo un nuovo metodo per il selettore "DatePickerDoneClick" come di seguito - (void) DatePickerDoneClick {NSLog (@ "Done clicked"); rating.text = pickerView objectAtIndex: row]} cosa devo fare, quindi quando faccio clic sul pulsante fatto UIActionSheet (aac) ignora e textfield (rating.text) viene riempito con il valore selezionato dal selettore grazie sagar
Apache

1
@Spark è possibile dare qualche idea su come ottenere il testo del selettore .. grazie per il tuo post + 1
vinothp

10

L'eccellente soluzione di Marcio a questa domanda mi è stata di grande aiuto nell'aggiungere sottoview di qualsiasi tipo a un UIActionSheet.

Per ragioni che non mi sono (ancora) del tutto chiare, i limiti dell'UIActionSheet possono essere impostati solo dopo che è stato visualizzato; sia le soluzioni di sagar che di marcio risolvono con successo questo problema con un messaggio setBounds: CGRectMake (...) inviato al foglio delle azioni dopo che è stato mostrato.

Tuttavia, l'impostazione dei limiti di UIActionSheet dopo che il foglio è stato visualizzato crea una transizione improvvisa quando appare l'ActionSheet, dove "compare" nella visualizzazione e quindi scorre solo sugli ultimi 40 pixel circa.

Quando si ridimensiona un UIPickerView dopo aver aggiunto le sottoview, consiglio di racchiudere il messaggio setBounds inviato all'actionSheet all'interno di un blocco di animazione. Questo renderà più agevole l'ingresso del foglio di azione.

UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];


// add one or more subviews to the UIActionSheet
// this could be a UIPickerView, or UISegmentedControl buttons, or any other 
// UIView.  Here, let's just assume it's already set up and is called 
// (UIView *)mySubView
[actionSheet addSubview:myView];

// show the actionSheet
[actionSheet showInView:[UIApplication mainWindow]];


// Size the actionSheet with smooth animation
    [UIView beginAnimations:nil context:nil];
    [actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
    [UIView commitAnimations]; 

6
Questo è un ottimo suggerimento. Sotto ios 4 e versioni successive, questo stile di animazione è "sconsigliato" anche se come da documentazione. Sotto iOS 4 o versioni successive, prova questo invece: UIView animateWithDuration: 0.3f ritardo: 0 opzioni: UIViewAnimationOptionCurveEaseInOut animazioni: ^ {[actionSheet setBounds: CGRectMake (0,0,320,485)];} completamento: NULL];
ceperry

9

Per quei ragazzi che stanno cercando di trovare la funzione DatePickerDoneClick ... ecco il semplice codice per chiudere il foglio delle azioni. Ovviamente aac dovrebbe essere un ivar (quello che va nel file .h di implmentation)


- (void)DatePickerDoneClick:(id)sender{
    [aac dismissWithClickedButtonIndex:0 animated:YES];
}

9

Non capisco davvero perché UIPickerViewsta andando all'interno di un file UIActionSheet. Questa sembra essere una soluzione disordinata e hacky, che può essere interrotta in una futura versione di iOS. (Ho già avuto cose come questa interruzione in un'app in precedenza, in cui UIPickerViewnon veniva presentato al primo tocco e dovevo essere ritappato - strane stranezze con ilUIActionSheet ).

Quello che ho fatto è semplicemente implementare un UIPickerViewe poi aggiungerlo come una vista secondaria alla mia vista e animarlo spostandolo verso l'alto come se fosse presentato come un foglio di azione.

/// Add the PickerView as a private variable
@interface EMYourClassName ()

@property (nonatomic, strong) UIPickerView *picker;
@property (nonatomic, strong) UIButton *backgroundTapButton;

@end

///
/// This is your action which will present the picker view
///
- (IBAction)showPickerView:(id)sender {

    // Uses the default UIPickerView frame.
    self.picker = [[UIPickerView alloc] initWithFrame:CGRectZero];

    // Place the Pickerview off the bottom of the screen, in the middle set the datasource delegate and indicator
    _picker.center = CGPointMake([[UIScreen mainScreen] bounds].size.width / 2.0, [[UIScreen mainScreen] bounds].size.height + _picker.frame.size.height);
    _picker.dataSource = self;
    _picker.delegate = self;
    _picker.showsSelectionIndicator = YES;

    // Create the toolbar and place it at -44, so it rests "above" the pickerview.
    // Borrowed from @Spark, thanks!
    UIToolbar *pickerDateToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, -44, 320, 44)];
    pickerDateToolbar.barStyle = UIBarStyleBlackTranslucent;
    [pickerDateToolbar sizeToFit];

    NSMutableArray *barItems = [[NSMutableArray alloc] init];

    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];

    // The action can whatever you want, but it should dimiss the picker.
    UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(backgroundTapped:)];
    [barItems addObject:doneBtn];

    [pickerDateToolbar setItems:barItems animated:YES];
    [_picker addSubview:pickerDateToolbar];

    // If you have a UITabBarController, you should add the picker as a subview of it
    // so it appears to go over the tabbar, not under it. Otherwise you can add it to 
    // self.view
    [self.tabBarController.view addSubview:_picker];

    // Animate it moving up
    [UIView animateWithDuration:.3 animations:^{
        [_picker setCenter:CGPointMake(160, [[UIScreen mainScreen] bounds].size.height - 148)]; //148 seems to put it in place just right.
    } completion:^(BOOL finished) {
        // When done, place an invisible button on the view behind the picker, so if the
        // user "taps to dismiss" the picker, it will go away. Good user experience!
        self.backgroundTapButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _backgroundTapButton.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
        [_backgroundTapButton addTarget:self action:@selector(backgroundTapped:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:_backgroundTapButton];
    }];

}

// And lastly, the method to hide the picker.  You should handle the picker changing
// in a method with UIControlEventValueChanged on the pickerview.
- (void)backgroundTapped:(id)sender {

    [UIView animateWithDuration:.3 animations:^{
        _picker.center = CGPointMake(160, [[UIScreen mainScreen] bounds].size.height + _picker.frame.size.height);
    } completion:^(BOOL finished) {
        [_picker removeFromSuperview];
        self.picker = nil;
        [self.backgroundTapButton removeFromSuperview];
        self.backgroundTapButton = nil;
    }];
}

Questo è un grande grazie. Hai trovato che funziona bene con iOS 7?
avance

1
+1 per una visualizzazione di selezione semplice e fantastica che si anima sullo schermo. Ma hai un errore nel codice. La vista backgroundTapButton si genera sopra la vista del selettore e lì blocca la vista del selettore dall'interazione dell'utente. quello che intendi veramente fare era rendere questa vista sullo spazio rimanente sullo schermo che la vista del selettore non riempie già ... (non puoi fare una vista dietro la vista del selettore come intendi)
aZtraL-EnForceR

7

Per aggiungere alla fantastica soluzione di Marcio, dismissActionSheet:può essere implementato come segue.

  1. Aggiungi un oggetto ActionSheet al tuo file .h, sintetizzalo e referenziarlo nel tuo file .m.
  2. Aggiungi questo metodo al tuo codice.

    - (void)dismissActionSheet:(id)sender{
      [_actionSheet dismissWithClickedButtonIndex:0 animated:YES];
      [_myButton setTitle:@"new title"]; //set to selected text if wanted
    }

3

Penso che questo sia il modo migliore per farlo.

ActionSheetPicker-3.0

È più o meno quello che suggeriscono tutti, ma usa i blocchi, che è un bel tocco!


Bene, se leggi sopra vedrai che questa classe ActionSheetPicker è nata in primo luogo, a causa di questo thread. Quindi sì, questo è il modo migliore, grazie alla soluzione accettata (¬_¬). stackoverflow.com/questions/1262574/...
OpenUserX03

2
Sembra che Apple stia per iniziare ad applicare la regola secondo cui i fogli di azioni non devono essere sottoclassi perché ricevo questo messaggio di errore - "<Error>: CGContextSetFillColorWithColor: contesto non valido 0x0. Questo è un errore grave. Questa applicazione o una libreria che utilizza , utilizza un contesto non valido e quindi contribuisce a un degrado generale della stabilità e dell'affidabilità del sistema. Questo avviso è una cortesia: correggi questo problema. Diventerà un errore irreversibile in un prossimo aggiornamento. "
Stuart P.

@StuartP. vedi la mia risposta
Kyle Clegg

2

Da iOS 8, non puoi, non funziona perché Apple ha cambiato l'implementazione interna di UIActionSheet. Fare riferimento alla documentazione Apple :

Note di sottoclasse

UIActionSheet non è progettato per essere sottoclasse, né è necessario aggiungere visualizzazioni alla sua gerarchia . Se è necessario presentare un foglio con una maggiore personalizzazione rispetto a quella fornita dall'API UIActionSheet, è possibile crearne uno personalizzato e presentarlo in modo modale con presentViewController: animated: completamento :.


1

Mi è piaciuto l'approccio adottato da Wayfarer e flexaddicted, ma ho scoperto (come aZtral) che non funzionava poiché backgroundTapButton era l'unico elemento che rispondeva all'interazione dell'utente. Questo mi ha portato a mettere tutte e tre le sue sottoview: _picker, _pickerToolbar e backgroundTapButton all'interno di una vista contenitore (popup) che è stata quindi animata dentro e fuori dallo schermo. Avevo anche bisogno di un pulsante Annulla sulla _pickerToolbar. Di seguito sono riportati gli elementi di codice rilevanti per la visualizzazione popup (è necessario fornire la propria origine dati di selezione e metodi delegati).

#define DURATION            0.4
#define PICKERHEIGHT        162.0
#define TOOLBARHEIGHT       44.0

@interface ViewController ()
@property (nonatomic, strong) UIView        *popup;
@property (nonatomic, strong) UIPickerView  *picker;
@property (nonatomic, strong) UIToolbar     *pickerToolbar;
@property (nonatomic, strong) UIButton      *backgroundTapButton;
@end

-(void)viewDidLoad {
    // These are ivars for convenience
    rect = self.view.bounds;
    topNavHeight = self.navigationController.navigationBar.frame.size.height;
    bottomNavHeight = self.navigationController.toolbar.frame.size.height;
    navHeights = topNavHeight + bottomNavHeight;
}

-(void)showPickerView:(id)sender {
    [self createPicker];
    [self createToolbar];

    // create view container
    _popup = [[UIView alloc] initWithFrame:CGRectMake(0.0, topNavHeight, rect.size.width, rect.size.height - navHeights)];
    // Initially put the centre off the bottom of the screen
    _popup.center = CGPointMake(rect.size.width / 2.0, rect.size.height + _popup.frame.size.height / 2.0);
    [_popup addSubview:_picker];
    [_popup insertSubview:_pickerToolbar aboveSubview:_picker];

    // Animate it moving up
    // This seems to work though I am not sure why I need to take off the topNavHeight
    CGFloat vertCentre = (_popup.frame.size.height - topNavHeight) / 2.0;

    [UIView animateWithDuration:DURATION animations:^{
        // move it to a new point in the middle of the screen
        [_popup setCenter:CGPointMake(rect.size.width / 2.0, vertCentre)];
    } completion:^(BOOL finished) {
        // When done, place an invisible 'button' on the view behind the picker,
        // so if the user "taps to dismiss" the picker, it will go away
        self.backgroundTapButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _backgroundTapButton.frame = CGRectMake(0, 0, _popup.frame.size.width, _popup.frame.size.height);
        [_backgroundTapButton addTarget:self action:@selector(doneAction:) forControlEvents:UIControlEventTouchUpInside];
        [_popup insertSubview:_backgroundTapButton belowSubview:_picker];
        [self.view addSubview:_popup];
    }];
}

-(void)createPicker {
    // To use the default UIPickerView frame of 216px set frame to CGRectZero, but we want the 162px height one
    CGFloat     pickerStartY = rect.size.height - navHeights - PICKERHEIGHT;
    self.picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, pickerStartY, rect.size.width, PICKERHEIGHT)];
    _picker.dataSource = self;
    _picker.delegate = self;
    _picker.showsSelectionIndicator = YES;
    // Otherwise you can see the view underneath the picker
    _picker.backgroundColor = [UIColor whiteColor];
    _picker.alpha = 1.0f;
}

-(void)createToolbar {
    CGFloat     toolbarStartY = rect.size.height - navHeights - PICKERHEIGHT - TOOLBARHEIGHT;
    _pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, toolbarStartY, rect.size.width, TOOLBARHEIGHT)];
    [_pickerToolbar sizeToFit];

    NSMutableArray *barItems = [[NSMutableArray alloc] init];
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelAction:)];
    [barItems addObject:cancelButton];

    // Flexible space to make the done button go on the right
    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];

    // The done button
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)];
    [barItems addObject:doneButton];
    [_pickerToolbar setItems:barItems animated:YES];
}

// The method to process the picker, if we have hit done button
- (void)doneAction:(id)sender {
    [UIView animateWithDuration:DURATION animations:^{
        _popup.center = CGPointMake(rect.size.width / 2.0, rect.size.height + _popup.frame.size.height / 2.0);
    } completion:^(BOOL finished) { [self destroyPopup]; }];
    // Do something to process the returned value from your picker
}

// The method to process the picker, if we have hit cancel button
- (void)cancelAction:(id)sender {
    [UIView animateWithDuration:DURATION animations:^{
        _popup.center = CGPointMake(rect.size.width / 2.0, rect.size.height + _popup.frame.size.height / 2.0);
    } completion:^(BOOL finished) { [self destroyPopup]; }];
}

-(void)destroyPopup {
    [_picker removeFromSuperview];
    self.picker = nil;
    [_pickerToolbar removeFromSuperview];
    self.pickerToolbar = nil;
    [self.backgroundTapButton removeFromSuperview];
    self.backgroundTapButton = nil;
    [_popup removeFromSuperview];
    self.popup = nil;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.