На самом деле я делаю приложение тревоги. В этом случае, когда я устанавливаю время, в это время происходит событие UILocalNotification, которое вызывает метод класса AppDelegate, т.е. метод didReceiveNotifications. В этом методе я написал код для вызова метода SetViewController (метод showReminder), и теперь в этом методе я хочу, чтобы он отображал NewViewController, т.е. TimeViewController, так как я должен показывать анимацию при возникновении тревоги.
Мне это нужно, так как при вызове Alarm я настроил отображение листа Action, но я хотел показать анимацию. Лист действий отображается во всех видах, но анимация может быть показана только в определенном виде, поэтому мне нужно показать A другой ViewController.
Вот код для того, что я пытаюсь: -
Я пробовал все это также как PresentModalViewController, dismissModalViewController, AddSubview, удалить superView ... но результат отрицательный :( что я должен делать ..?
Почти весь код: -
Класс AppDelegate: -
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
if (notification){
NSLog(@"In did Notification");
NSString *reminderText = [notification.userInfo objectForKey:kRemindMeNotificationDataKey];
[viewController showReminder:reminderText];
application.applicationIconBadgeNumber = 0;
}
}
setViewController.h: -
@interface SetAlarmViewController : UIViewController <UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate,UIActionSheetDelegate>{
IBOutlet UITableView *tableview;
IBOutlet UIDatePicker *datePicker;
IBOutlet UITextField *eventText;
TPKeyboardAvoidingScrollView *scrollView;
IBOutlet UINavigationBar *titleBar;
IBOutlet UIButton *setAlarmButton;
AVAudioPlayer *player;
int index;
The420DudeAppDelegate *appDelegate;
TimeViewController *viewController;
IBOutlet UIImageView *animatedImages;
NSMutableArray *imageArray;
AVPlayerItem *player1,*player3;
AVPlayerItem *player2,*player4;
AVQueuePlayer *queuePlayer;
}
@property (nonatomic, retain) IBOutlet UIImageView *animatedImages;
@property (nonatomic, retain) IBOutlet UITableView *tableview;
@property (nonatomic, retain) IBOutlet UIDatePicker *datePicker;
@property (nonatomic, retain) IBOutlet UITextField *eventText;
@property (nonatomic, retain) TPKeyboardAvoidingScrollView *scrollView;
@property(nonatomic, retain) IBOutlet UINavigationBar *titleBar;
@property(nonatomic, retain) IBOutlet UIButton *setAlarmButton;
@property(nonatomic) UIReturnKeyType returnKeyType;
@property(nonatomic, retain) IBOutlet TimeViewController *viewController;
- (IBAction) scheduleAlarm:(id)sender;
- (void)showReminder:(NSString *)text;
-(IBAction)onTapHome;
-(IBAction)onTapChange:(id)sender;
@end
SetViewController.m: -
@synthesize datePicker,tableview, eventText,titleBar,setAlarmButton,returnKeyType,scrollView,animatedImages,viewController;
// 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;
viewController = [[TimeViewController alloc] initWithNibName:@"TimeViewController" bundle:nil];
NSDate *now = [NSDate date];
[datePicker setDate:now animated:YES];
eventText.delegate = self;
index = 0;
NSString *path1 = [[NSBundle mainBundle] pathForResource:@"inhale" ofType:@"mp3"];
NSURL *url1 = [NSURL fileURLWithPath:path1];
player1 = [[AVPlayerItem alloc]initWithURL:url1];
NSString *path3 = [[NSBundle mainBundle] pathForResource:@"sound1" ofType:@"wav"];
NSURL *url3 = [NSURL fileURLWithPath:path3];
player3 = [[AVPlayerItem alloc]initWithURL:url3];
NSString *path2 = [[NSBundle mainBundle] pathForResource:@"exhale" ofType:@"mp3"];
NSURL *url2 = [NSURL fileURLWithPath:path2];
player2 = [[AVPlayerItem alloc]initWithURL:url2];
NSString *path4 = [[NSBundle mainBundle] pathForResource:@"Dude" ofType:@"mp3"];
NSURL *url4 = [NSURL fileURLWithPath:path4];
player4 = [[AVPlayerItem alloc]initWithURL:url4];
NSArray *items = [[NSArray alloc]initWithObjects:player1,player3,player2,player4,nil];
queuePlayer = [[AVQueuePlayer alloc] initWithItems:items];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playEnded) name:AVPlayerItemDidPlayToEndTimeNotification object:player4];
}
-(void)onAlarmInvoke
{
animatedImages = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
animatedImages.userInteractionEnabled = YES;
[animatedImages setContentMode:UIViewContentModeScaleToFill];
[self.view addSubview : animatedImages];
[queuePlayer play];
// Array to hold jpg images
imageArray = [[NSMutableArray alloc] initWithCapacity:IMAGE_COUNT];
// Build array of images, cycling through image names
for (int i = 1; i <= IMAGE_COUNT; i++)
[imageArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"animation(%d).jpg", i]]];
animatedImages.animationImages = [NSArray arrayWithArray:imageArray];
// One cycle through all the images takes 1.0 seconds
animatedImages.animationDuration = 12.0;
// Repeat foreverlight electro / 4 sec.
animatedImages.animationRepeatCount = -1;
// Add subview and make window visible
// [self.view addSubview:animatedImages];
animatedImages.image = [imageArray objectAtIndex:imageArray.count - 1];
// Start it up
[animatedImages startAnimating];
// Wait 5 seconds, then stop animation
[self performSelector:@selector(stopAnimation) withObject:nil afterDelay:15000];
}
-(void)playEnded
{
[self performSelector:@selector(playNextItem) withObject:nil afterDelay:5.0];
}
-(void)playNextItem
{
[queuePlayer play];
}
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
[scrollView adjustOffsetToIdealIfNeeded];
}
-(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];
// 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:pickerDate];
pickerDate = [cal dateFromComponents:dc];
NSLog(@"%@ is the date in picker date",pickerDate);
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];
}
- (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)viewDidUnload {
datePicker = nil;
tableview = nil;
eventText = nil;
[self setScrollView:nil];
[super viewDidUnload];
}
- (void)showReminder:(NSString *)text {
[self onAlarmInvoke];
[self.view addSubview:viewController.view];
UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"Cancel" otherButtonTitles:nil];
[actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
CGRect rect = self.view.frame;
// if(rect.origin.y <= 480)
// rect.origin.y +=20;
self.view.frame = rect;
[actionSheet showInView:self.view];
[actionSheet release];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(buttonIndex == 0)
{
[player stop];
NSLog(@"OK Tapped");
}
if(buttonIndex == 1)
{
[player stop];
NSLog(@"Cancel Tapped");
}
}
-(IBAction)onTapHome{
viewController = [[TimeViewController alloc] initWithNibName:@"TimeViewController" bundle:nil];
[self presentModalViewController:viewController animated:YES];
}
- (void)dealloc {
[super dealloc];
[datePicker release];
[tableview release];
[eventText release];
[scrollView release];
}
-(IBAction)onTapChange:(id)sender{
SetTimeViewController *viewC = [[SetTimeViewController alloc]initWithNibName:@"SetTimeViewController" bundle:nil];
[self presentModalViewController:viewC animated:YES];
}
@end