2011-12-22 61 views
0

我制作了一个应用程序,它是一个定制的警报应用程序。 UILocalNotification应该在我选择的时间调用UIDatePicker,但不是在正确的时间调用。例如,我选择了时间为下午2点的闹钟,所以通知将在下午2点到2点1分之间调用...但不确定何时...它给我延迟了随机时间。在我的UITableView中,您可以看到它显示的描述也出现错误。我知道我来自印度,因此它显示了GMT时间,但是它可以被纠正吗?UILocalNotification的调用延迟

这里是我的整个代码: - ----------------------------- AppDelegate.m File:---- --------------------------

@synthesize window,viewController,timeViewController; 
NSString *kRemindMeNotificationDataKey = @"kRemindMeNotificationDataKey"; 
#pragma mark - 
#pragma mark === Application Delegate Methods === 
#pragma mark - 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    int x = [[NSUserDefaults standardUserDefaults] integerForKey:@"Mayank"]; 
    if(x == 1) 
    { 
     timeViewController = [[TimeViewController alloc]initWithNibName:@"TimeViewController" bundle:nil]; 
     timeViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
     CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame; 
     CGRect frame = timeViewController.view.frame; 
     frame.origin = CGPointMake(frame.origin.x,frame.origin.y + statusBarFrame.size.height); 
     timeViewController.view.frame = frame; 
     [self.window addSubview:timeViewController.view]; 
    } 
    else 
    { 
     [[NSUserDefaults standardUserDefaults]setInteger:1 forKey:@"Mayank"]; 
     [[NSUserDefaults standardUserDefaults]synchronize]; 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Do you want to set the Default Alarm?" message:@"at 4:20 PM" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok",nil]; 
     [alert show]; 
     [alert release]; 
    } 
    sleep(1); 
    [self.window makeKeyAndVisible]; 
    application.applicationIconBadgeNumber = 0; 
    // Handle launching from a notification 
    UILocalNotification *localNotification = 
    [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 
    if (localNotification) { 
     NSString *reminderText = [localNotification.userInfo 
            objectForKey:kRemindMeNotificationDataKey]; 
     [viewController showReminder:reminderText]; 
    } 
    return YES; 
} 
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if(buttonIndex == 0) 
    { 
     timeViewController = [[TimeViewController alloc]initWithNibName:@"TimeViewController" bundle:nil]; 
     timeViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
     CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame; 
     CGRect frame = timeViewController.view.frame; 
     frame.origin = CGPointMake(frame.origin.x,frame.origin.y + statusBarFrame.size.height); 
     timeViewController.view.frame = frame; 
     [self.window addSubview:timeViewController.view]; 
    } 
    if(buttonIndex == 1) 
    { 
     viewController = [[SetAlarmViewController alloc]initWithNibName:@"SetAlarmViewController" bundle:nil]; 
     viewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
     CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame; 
     CGRect frame = viewController.view.frame; 
     frame.origin = CGPointMake(frame.origin.x,frame.origin.y + statusBarFrame.size.height); 
     viewController.view.frame = frame; 
     [self.window addSubview:viewController.view];  
    } 
} 
- (void)application:(UIApplication *)application 
didReceiveLocalNotification:(UILocalNotification *)notification { 
    NSString *reminderText = [notification.userInfo 
           objectForKey:kRemindMeNotificationDataKey]; 
    [viewController showReminder:reminderText]; 
    application.applicationIconBadgeNumber = 0; 
} 

----------------- ------------ mainViewController.m File:------------------------------

@implementation SetAlarmViewController 
@synthesize datePicker,tableview, eventText,titleBar,setAlarmButton,returnKeyType; 


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 

    [super viewDidLoad]; 

    appDelegate = (The420DudeAppDelegate *)[[UIApplication sharedApplication] delegate];  
    eventText.returnKeyType = UIReturnKeyDone; 

// datePicker.minimumDate = [NSDate date]; 
    NSDate *now = [NSDate date]; 
    [datePicker setDate:now animated:YES]; 
    eventText.delegate = self; 
    index = 0; 
} 

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:YES]; 
    [self.tableview reloadData]; 
} 

- (IBAction) scheduleAlarm:(id) sender { 
    [eventText resignFirstResponder]; 

// Get the current date 
    NSDate *pickerDate = [self.datePicker date]; 

    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
    if (localNotif == nil) 
     return; 
    localNotif.fireDate = pickerDate; 
// NSLog(@"%@",localNotif.fireDate); 
    localNotif.timeZone = [NSTimeZone defaultTimeZone]; 
// NSLog(@"%@",localNotif.timeZone); 

    // Notification details 
    localNotif.alertBody = [eventText text]; 

    // Set the action button 
    localNotif.alertAction = @"Show me"; 
    localNotif.repeatInterval = NSDayCalendarUnit; 
    localNotif.soundName = @"jet.wav"; 
    // Specify custom data for the notification 
    NSDictionary *userDict = [NSDictionary dictionaryWithObject:eventText.text 
                 forKey:kRemindMeNotificationDataKey]; 
    localNotif.userInfo = userDict; 

    // Schedule the notification 
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 
    [localNotif release]; 

    [self.tableview reloadData]; 
    eventText.text = @""; 

    viewController = [[TimeViewController alloc] initWithNibName:@"TimeViewController" bundle:nil]; 
    [self presentModalViewController:viewController animated:YES]; 
} 

#pragma mark - 
#pragma mark Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    // Return the number of sections. 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // Return the number of rows in the section. 
    return [[[UIApplication sharedApplication] scheduledLocalNotifications] count]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    index = indexPath.row; 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Warning!!!" 
                 message:@"Are you sure you want to Delete???" delegate:self 
               cancelButtonTitle:@"Cancel" 
               otherButtonTitles:@"Ok",nil]; 
    [alertView show]; 
    [alertView release]; 

} 
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications]; 
    UILocalNotification *notify = [notificationArray objectAtIndex:index]; 

    if(buttonIndex == 0) 
    { 
     // Do Nothing on Tapping Cancel... 
    } 
    if(buttonIndex ==1) 
    { 
     if(notify) 
      [[UIApplication sharedApplication] cancelLocalNotification:notify]; 
    } 
    [self.tableview reloadData]; 
} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    // Configure the cell... 

    NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications]; 
    UILocalNotification *notif = [notificationArray objectAtIndex:indexPath.row]; 

    [cell.textLabel setText:notif.alertBody]; 
    [cell.detailTextLabel setText:[notif.fireDate description]];  
    return cell; 
} 


- (void)showReminder:(NSString *)text { 
    /* 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Reminder" 
    message:@"hello" delegate:self 
    cancelButtonTitle:@"OK" 
    otherButtonTitles:nil]; 
    [alertView show]; 
    [self.tableview reloadData]; 
    [alertView release]; 
    */ 

    NSString *path = [[NSBundle mainBundle]pathForResource:@"jet" ofType:@"wav"]; 
    NSURL *url = [NSURL fileURLWithPath:path]; 

    player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil]; 
    player.numberOfLoops = -1; 
    [player play]; 

    UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:nil]; 
    [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent]; 
    [actionSheet showInView:self.view]; 
// [actionSheet showInView:[[UIApplication sharedApplication] keyWindow]]; 
    [actionSheet release]; 

} 
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    [player stop]; 
    if(buttonIndex == 0) 
    { 
     NSLog(@"OK Tapped"); 
    } 
    if(buttonIndex == 1) 
    { 
     NSLog(@"Cancel Tapped"); 
    } 
} 

的这张照片显示了我的应用程序查看:

Alarm App View

回答

0

我认为这里的问题与NSDatePicker一起返回当前时间的秒数以及选定的时间。您需要从NSDatePicker返回的日期中去除秒数,并将其用于闹钟和本地通知。

NSDate *selectedDate = [datePicker date]; // you don't need to alloc-init the variable first 
NSCalendar *cal = [NSCalendar currentCalendar]; 
NSDateComponents *dc = [cal components: (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:selectedDate]; 
selectedDate = [cal dateFromComponents:dc]; 

//现在你有一个零秒一个NSDate为您报警 你应该得到您的通知更好的精度,但是我不认为他们会保证正好在一瞬间。

0

请记住,datepicker的日期与GMT一致。你必须自己转换到你自己的时区。这可能是你的情况的问题。

+0

我知道....我想知道如何解决这个问题?顺便说一下,我的主要问题不是这个。 – mAc

+0

这只是一个提示。 – samfisher

1
NSDate *pickerDate = [self.pickerTime date]; 
// Break the date up into components 
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:pickerDate]; 
NSDateComponents *timeComponents = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:pickerDate]; 
// Set up the fire time 
NSDateComponents *dateComps = [[NSDateComponents alloc] init]; 
[dateComps setDay:[dateComponents day]]; 
[dateComps setMonth:[dateComponents month]]; 
[dateComps setYear:[dateComponents year]]; 
[dateComps setHour:[timeComponents hour]]; 
[dateComps setMinute:[timeComponents minute]]; 
**[dateComps setSecond:00];** 
NSDate *itemDate = [calendar dateFromComponents:dateComps]; 
localNotification.fireDate = itemDate;