2012-06-24 3 views
9

Я хорошо провел время и пришел к выводу, что UIDatePicker замедляет presentModalViewController: на несколько секунд. У меня есть контроллер просмотра с двумя кнопками и устройством выбора даты. В другом классе, я представляю этот вид контроллер с этим кодом:UIDatePicker замедляет работу

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

Я удалил выбор даты в RandomClass и заметил, что я могу представить RandomClass довольно быстро, когда я вставляю выбор даты внутри точки зрения, это замедляет все снова. Я попытался добавить программу выбора даты программно и представить контроллер модального представления в другом потоке, но все еще есть отставание.

У вас эта же проблема? Вы знаете, как это исправить? Я бы очень признателен за ваши ответы и помощь. Благодаря!

+0

делает это действительно нужно быть модальным viewcontroller? Как насчет только вида с белым фоном, 0,3 альфа с датой в нем? –

+2

Я тоже это заметил. Я нажимаю ViewController на UINavigationController и испытываю такое же отставание. Было бы неплохо найти решение этого. – Joony

ответ

7

Я испытывал такое же вялое представление с модальной презентацией. Я пришел к решению, жертвуя некоторой памятью в пользу производительности.

ОБЩАЯ ИНФОРМАЦИЯ: Мое приложение было использовано Model-View-Controller-Store. Магазин был синглом, который заботился о моей модели, поэтому он был практически доступен из любого из моих классов после его создания. Я использовал класс Store, чтобы поддерживать некоторые дорогие классы (например, NSCalendar, NSDateFormatter и т. Д.) Через свойства.

РЕШЕНИЕ:
Я упаковал свойство UIDatePicker в магазине одноплодного, что позволило ему получить доступ через любой класс.

В интерфейсе Singleton:

@property (strong, nonatomic) UIDatePicker *datePicker; 

В реализации Singleton я реализовал поглотитель для Datepicker.

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

    return _datePicker; 
} 

Это обеспечило Datepicker создавался только один раз, и она может быть доступна из любого места в моем приложении.

Теперь в методе viewDidLoad класса, где вам нужно будет использовать палитру, получить свойство через метод получения:

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]]; 

Вялое поведение будет происходить в первый раз, когда выбор даты создается. Каждый раз модальное представление будет казаться невероятно быстрым (в зависимости от того, что у вас было в представлении).

По существу, я создавал глобальную переменную и поддерживал ее, чтобы мне не приходилось создавать ее каждый раз за счет памяти. Разница в производительности сделала его полезным в случае с приложениями.

ПРИМЕЧАНИЕ: Для удобства еще одно предупреждение. Поскольку datePicker, скорее всего, переживет модальное представление, обязательно убедитесь, что datePicker не указывает на какую-либо освобожденную память.

Так что, если «я» был назначен в качестве мишени в viewDidLoad:

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

Очень важно, что в способе, такие как viewDidDisappear добавить этот код, чтобы предотвратить аварию:

[aDatePicker removeTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged]; 
+0

Ну, это было несколько месяцев назад, но это похоже на отличное решение! – MCKapur

6

Чтобы решить проблемы с производительностью с помощью UIDatePicker, создайте свой выборщик программно и только в viewDidAppear. Например, если вы создаете его в viewDidLoad, медленное создание экземпляра блокирует отображение вида на экране.

+2

Создание сборщика в представленииDidAppear имеет неудачный побочный эффект, когда сборщик появляется после того, как остальная часть обзора уже была видна. Не хороший визуальный эффект. – Raz

+0

@Raz: На самом деле это решение является правильным для указанного прецедента, когда вы создаете экземпляр выбора даты с экрана для представления позже. Очевидно, что это не было бы сделано, если бы датпикер был необходим немедленно. –

Смежные вопросы