UIDatePicker vertraagt ​​dingen

Ik heb een goede tijd doorgebracht en geconcludeerd dat UIDatePicker presentModalViewController: met enkele seconden vertraagt. Ik heb een view-controller met twee knoppen en een datumkiezer. In een andere klasse presenteer ik deze view controller met deze code:

RandomClass *class = [[RandomClass alloc] init];
[class setModalTransitionStyle: UIModalTransitionStyleCrossDissolve]; //an animation
[self presentModalViewController: class animated: YES];
[class release];

Ik heb de datumkiezer verwijderd in RandomClass en merkte op dat ik RandomClass vrij snel kan presenteren, wanneer ik een datumkiezer in de weergave plaats, vertraagt ​​het de situatie weer. Ik heb geprobeerd de datumkiezer programmatisch toe te voegen en de modale weergaveregelaar in een andere thread te presenteren, maar er is nog steeds vertraging.

Heb je hetzelfde probleem? Weet jij hoe je het kunt repareren? Ik zou je antwoorden en hulp erg op prijs stellen. Bedankt!

9
Moet dit echt een modale viewcontroller zijn? Wat dacht je van alleen een weergave met een witte achtergrond, 0,3 alpha met de datepicker erin?
toegevoegd de auteur ott--, de bron
Ik merkte dit ook. Ik push een ViewController op een UINavigationController en ervaar dezelfde vertraging. Het zou leuk zijn om hier een oplossing voor te vinden.
toegevoegd de auteur Joony, de bron

2 antwoord

Ik ervoer dezelfde trage prestaties met modale weergavepresentaties. Ik kwam tot een oplossing door wat geheugen op te offeren ten gunste van de prestaties.

BACKGROUND: My app was using the Model-View-Controller-Store model. The Store was a singleton which was taking care of my model, hence it was virtually accessible from any of my classes once it was instantiated. I was using the Store class to keep around certain expensive classes (such as NSCalendar, NSDateFormatter etc) through properties.

SOLUTION:
I crated a UIDatePicker property in the Store singleton, which allowed it to be accessed through any class.

In de interface van de Singleton:

@property (strong, nonatomic) UIDatePicker *datePicker;

Bij de implementatie van de Singleton heb ik een getter voor de datePicker geïmplementeerd.

- (UIDatePicker *)datePicker
{
    if (!_datePicker) {
        _datePicker = [[UIDatePicker alloc] init];
    }

    return _datePicker;
}

Hierdoor is datePicker slechts één keer gemaakt en is het overal in mijn app toegankelijk.

Nu in de viewDidLoad-methode van de klasse waar u de picker zou moeten gebruiken, haalt u de eigenschap op via de methode getter:

UIDatePicker *aDatePicker = [[MySingleton shareInstance] datePicker];
// Set it's location.
    [aDatePicker setFrame:CGRectMake(0.0, 236.0, self.view.frame.size.width, 216.0)];
// Connect to any actions
    [aDatePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
// Add it to you view
    [self.view addSubview:[[MySingleton shareInstance] datePicker]];

Het trage gedrag gebeurt voor de eerste keer wanneer de datumkiezer wordt gemaakt. Elke andere keer zal de modale weergave razendsnel verschijnen (afhankelijk van wat je nog meer had in de weergave).

In wezen was ik bezig een globale variabele te maken en die bij te houden zodat ik deze niet elke keer hoefde te maken, ten koste van het geheugen. Het prestatieverschil maakte het de moeite waard in mijn apps-hoesje.

NOTE: There is one caveat to watch for though. Since the datePicker will most likely outlive the modal view, it is imperative to make sure that the datePicker is not pointing to any deallocated memory.

Dus als "self" is toegewezen als doel in viewDidLoad:

[aDatePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];

Het is belangrijk dat in een methode zoals viewDidDisappear deze code toe te voegen om een ​​crash te voorkomen:

[aDatePicker removeTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
7
toegevoegd
Nou, dit was maanden geleden, maar het ziet eruit als een geweldige oplossing!
toegevoegd de auteur MCKapur, de bron

Om prestatieproblemen met UIDatePicker op te lossen, maakt u uw picker programmatisch en alleen in viewDidAppear. Als u het bijvoorbeeld in viewDidLoad maakt, zal de trage instantiatie voorkomen dat de weergave op het scherm verschijnt.

6
toegevoegd
@Raz: Eigenlijk is deze oplossing correct voor het opgegeven gebruik, waarbij iemand de datumkiezer buiten beeld zet voor latere presentatie. Vanzelfsprekend zou men dit niet doen als de datepicker onmiddellijk nodig was.
toegevoegd de auteur Pius Uzamere, de bron
Het maken van de picker in viewDidAppear heeft de ongelukkige bijwerking van het maken van de picker nadat de rest van de weergave al zichtbaar was. Geen goed visueel effect.
toegevoegd de auteur Raz, de bron