iPhone UIDatePicker очень медленно - PullRequest
2 голосов
/ 28 ноября 2011

Я использую UIDatePicker в ModeTime,

, но очень медленно ??

здесь код:

#import "U2YAccountController.h"

@implementation U2YAccountController
@synthesize timePicker = _timePicker;
@synthesize timeLabel= _timeLabel;  
@synthesize scheduleLabel = _scheduleLabel;

- (id)init
{
self = [super init];
if (self) {
    // Set title
    self.title = @"Reminder Settings"; 


    CGRect dosageImageRect = CGRectMake(10, 30, 300, 62);
    UIImageView *dosageImage = [[UIImageView alloc] initWithFrame:dosageImageRect];
    [dosageImage setImage:[UIImage imageNamed:@"dosageReminderButton.png"]]; //image was a button, now just image change name of png!
    dosageImage.opaque = YES; // explicitly opaque for performance
    [self.view addSubview:dosageImage];
    [dosageImage release];




    UIButton *timeReminderButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [timeReminderButton setImage:[UIImage imageNamed:@"reminderTimeButton.png"] forState:UIControlStateNormal]; 
    [timeReminderButton setFrame:CGRectMake(10, 110, 300, 44)];
    [timeReminderButton addTarget:self action:@selector(timeReminderButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [timeReminderButton setAdjustsImageWhenHighlighted:NO];
    [self.view addSubview:timeReminderButton];


    self.timePicker = [[[UIDatePicker alloc] initWithFrame:CGRectMake(0, 415, 220, 180)]autorelease];
    self.timePicker.datePickerMode = UIDatePickerModeTime;
    [self.timePicker addTarget:self action:@selector(timePickerChanged:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:self.timePicker];
    //[self.timePicker setHidden:YES];

    self.scheduleLabel = [[[UILabel alloc]initWithFrame:CGRectMake(22, 64, 200, 20)]autorelease];
    self.scheduleLabel.textColor = [UIColor colorWithRed:12/255.0 green:113/255.0 blue:186/255.0 alpha:1];
    self.scheduleLabel.text = @"Schedule 6 of 7 days";  //updated from web site!!
    [self.view addSubview:self.scheduleLabel];

    self.timeLabel = [[[UILabel alloc]initWithFrame:CGRectMake(213, 122, 80, 20)]autorelease];
    self.timeLabel.textColor = [UIColor colorWithRed:12/255.0 green:113/255.0 blue:186/255.0 alpha:1];
    self.timeLabel.backgroundColor = [UIColor clearColor];
    self.timeLabel.text = @"";
    [self.view addSubview:self.timeLabel];


    dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"hh:mma"];

}
return self;
}


 - (void) timeReminderButtonPressed :(id) sender {


recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped:)] ;


[UIView beginAnimations:@"PickerUp" context:nil];
[UIView setAnimationDuration:0.3f];
[UIView setAnimationBeginsFromCurrentState:YES];

self.timePicker.frame = CGRectMake(0, 237, 320, 180);

[self.view addGestureRecognizer:recognizer];

[recognizer release];



}

- (void) timePickerChanged:(id) sender {


today = [sender date];


NSString *dateString = [dateFormat stringFromDate:today];

self.timeLabel.text = dateString;


}

- (void) viewTapped :(id) sender {
[UIView beginAnimations:@"PickerDown" context:nil];
[UIView setAnimationDuration:0.3f];
[UIView setAnimationBeginsFromCurrentState:YES];

self.timePicker.frame = CGRectMake(0, 415, 320, 180);

[self.view removeGestureRecognizer:recognizer];

}


- (void) dealloc {

[dateFormat release];


[_scheduleLabel release];
[_timeLabel release];
[_timePicker release];
[super dealloc];
}

@end

Так почему мой сборщик работает медленно и застревает?Что я пропускаю ??

пс.Я прокомментировал nsDateFormatter, чтобы выяснить, была ли это проблема, но без изменений ...

спасибо большое!

Ответы [ 2 ]

6 голосов
/ 28 ноября 2011

Моя первоначальная реакция:

Выделение NSDateFormatter не дешевая перспектива. В вашем случае вы снова и снова используете одну и ту же строку формата, поэтому вам следует ДЕЙСТВИТЕЛЬНО просто выделить один NSDateFormatter, сохранить его как переменную экземпляра и затем использовать его при запуске действия UIDatePicker. Это должно значительно ускорить процесс.

3 голосов
/ 28 ноября 2011

Еще одна вещь, которую нужно добавить к предыдущему ответу, это то, что вы забыли зафиксировать свою анимацию. Я даже предлагаю вам использовать методы animateWith ... класса UIView, а не beginAnimation / commitAnimation, поскольку это должно быть быстрее (по крайней мере, для Apple). И еще один, чтобы пойти. Распознаватель жестов ... почему бы не создать его с представлением во время инициализации? зачем создавать его каждый раз, когда вы звоните сборщику?

...