iOS UIalertView displaying and processing order - ios

I have this code
- (IBAction)save:(id)sender {
self.imageView.image = [UIImage imageNamed:#"loading.gif"];
[self.view setUserInteractionEnabled:NO];
MBProgressHUD *hudSave = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
hudSave.labelText = #"Saving...";
NSLog(#"save");
UIAlertView *deco;
if (!isVideo) {
UIImageWriteToSavedPhotosAlbum (imageView.image, nil, nil , nil);
deco = [[UIAlertView alloc]initWithTitle:#"Save" message:#"Your photo has been saved." delegate: nil cancelButtonTitle:#"oK" otherButtonTitles:nil];
}else{
//UIAlertView *explain;
//explain = [[UIAlertView alloc]initWithTitle:#"Wait during processing" message:#"Your video is being filtered, this process may be long, depending of both video and device. Please do not close this app until task is finished." delegate:nil cancelButtonTitle:#"Ok" otherButtonTitles:nil];
UIAlertView *explain;
explain = [[UIAlertView alloc]initWithTitle:#"Wait during processing" message:#"Your video is being filtered, this process may be long, depending of both video and device. Please do not close this app until task is finished." delegate:nil cancelButtonTitle:#"Ok" otherButtonTitles:nil];
[explain show];
[self InitialisationRefiltrage:urlVideo];
//[self InitialisationRefiltrage:urlVideo];
deco = [[UIAlertView alloc]initWithTitle:#"Save" message:#"Your video has been saved." delegate: nil cancelButtonTitle:#"Ok" otherButtonTitles:nil];
}
[MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];
[deco show];
[self.view setUserInteractionEnabled:YES];
}
The problem part is if my file is a video, it goes directly too "initialisationRefiltrage" (who is working fine) but without displaying the MBProgressHUD and the alert view explain, and after my video traitement, it display everything (explain, deco, and the MBProgressHUD) at the same time.
I try something with dispatch, thread, etc... But i think a don't do it correctly, so can you please give me a clue too how to do that.
Have a nice day.

Put the code [self InitialisationRefiltrage:urlVideo] in the delegate method of your UIAlertView so that it is executed only when the alert has been displayed and user has tapped on a button of the alert.
You may also use instead some third-party UIAlertView subclasses that uses completion blocks to make your code only execute when the alert is dismissed. See my class that does this for example.
Besides, you should respect coding conventions and use a method name beginning with a lowercase letter to make your code more readable.

The UI is updated in the "run loop".
The calls you're making tell iOS to display some views (alert, MUD...) and it'll do that on the next run through the loop.
What you need to do is wait for the user to respond to the alert before continuing. You do this by setting yourself as the UIAlert's delegate, then responding to the event:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
...
}
There are also libraries available that allow you to pass a block to the alert view, thus simplifying the whole thing. (https://github.com/jivadevoe/UIAlertView-Blocks, for example)
P.S. I see that you're new to Stack Overflow - please tick my answer if you're happy that it has responded to your question...

Related

UIAlertView button text does not display

I'm attempting to get a simple alert message to display in my app. I am using the code recommended by Apple, but every time the Cancel button displays without its text. I don't believe I have any other code that could override the default display of the alert.
Screenshot can be seen here.
Here's my code to display the alert:
NSString *alertMessage = [NSString stringWithFormat:#"No results found for '%#'.", #"TEST"];
UIAlertView *theAlert = [[UIAlertView alloc] initWithTitle:#"Search Error"
message:alertMessage
delegate:nil
cancelButtonTitle:#"Cancel"
otherButtonTitles:nil];
[theAlert show];
When I use NSLog(#"%#", [theAlert buttonTitleAtIndex:0]); to log the title, it outputs "Cancel" just fine.
I want to comment, but I have low reputation for it... Anyway, I had simmilar issue with UIButton, and I figured out, it was bug in Xcode 6. Have you tried Xcode 5?

iOS - alertView shouldEnableFirstButton

I want the user to not be able to click the cancel button on UIAlertView, yet I still want it to be there, but shaded out. I know a shouldEnableFirstButton function is there but it doesn't involve cancel button. Do you have any idea how to do it?
Thanks.
Use the following:
UIAlertView *vw = [[UIAlertView alloc] initWithTitle:#"Information" message:#"This is a message" delegate:self cancelButtonTitle:#"OK" otherButtonTitles:#"Cancel", nil];
[vw show];
So, essentially you are setting the "Cancel" as other button.
Now, the following will solve your problem:
- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView
{
return NO;
}
If you want to perform some action in OK button press you can always do that here:
- (void)alertViewCancel:(UIAlertView *)alertView

UIAlertView Shows two times

Hope you are all doing good.
Where is my problem is concern one UIAlertView shows twice while executing the code. I have written it within -(void)viewDidAppear:(BOOL)animated as shown following
-(void)viewDidAppear:(BOOL)animated
{
//Finding city Name from coordinate
UIAlertView * alertForCoordinate=[[UIAlertView alloc]initWithTitle:#"Coordinate" message:[NSString stringWithFormat:#"latitude==>%f\nlongitude==>%f",self.userLocation.coordinate.latitude,self.userLocation.coordinate.longitude] delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil,nil];
[alertForCoordinate show];
[SVGeocoder reverseGeocode:CLLocationCoordinate2DMake(self.userLocation.coordinate.latitude, self.userLocation.coordinate.longitude)
completion:^(NSArray *placemarks, NSHTTPURLResponse *urlResponse, NSError *error)
{
if (placemarks.count>0)
{
CLPlacemark * placemark=[placemarks objectAtIndex:0];
currentLocationUpcoming =[placemark locality];
UIAlertView * alert=[[UIAlertView alloc]initWithTitle:#"Location" message:[NSString stringWithFormat:#"currentLocation==>%#",currentLocationUpcoming] delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil, nil];
[alert show];
[self.eventsTableView reloadData];
}
}];
}
As view appears First UIAlertView gets call and dismiss automatically then second gets call When I tap OK button of second alert and again first UIAlertView appears . I am struggling with it since last 4 hours and some of the answer put here also not intended the context in which I am working. Can anybody suggest me where I am wrong.
Thanks
You don't actually have the first UIAlertView showing twice - the animation just makes it look like this because you are showing two UIAlertViews in a row. You're probably seeing Alert 1-> Alert 2-> tap OK on Alert 2 -> Alert 1. This is because the UIAlertViews stack up if multiple are shown.
Think of it this way: Alert 1 shows first but animates for only a very brief period until it is interrupted by Alert 2 showing. Dismissing Alert 2 animates Alert 1 onscreen again, and even though it is still the same alert, it looks like it is showing twice.
Try this simple test case:
-(void)viewDidAppear:(BOOL)animated
{
[[[UIAlertView alloc] initWithTitle:#"Alert #1" message: delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil] show];
[[[UIAlertView alloc] initWithTitle:#"Alert #2" message: delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil] show];
}
You will see "Alert #1" for a fraction of a second, then "Alert #2" will remain onscreen. Tapping OK on "Alert #2" will show "Alert #1" again because it was below Alert #2 on the stack.
Your second alert overlaping the first one, and after dismissing second alert, the first one reappears on screen.
-(void)viewDidAppear:(BOOL)animated
{
UIAlertView * alertForCoordinate=[[UIAlertView alloc]initWithTitle:#"Coordinate" message:[NSString stringWithFormat:#"latitude==>%f\nlongitude==>%f",self.userLocation.coordinate.latitude,self.userLocation.coordinate.longitude] delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil,nil];
alertForCoordinate.tag = 1;
[alertForCoordinate show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0 && alertView.tag == 1) {
[SVGeocoder reverseGeocode:CLLocationCoordinate2DMake(self.userLocation.coordinate.latitude, self.userLocation.coordinate.longitude)
completion:^(NSArray *placemarks, NSHTTPURLResponse *urlResponse, NSError *error)
{
if (placemarks.count>0)
{
CLPlacemark * placemark=[placemarks objectAtIndex:0];
currentLocationUpcoming =[placemark locality];
/*****************Second Alert******************/
UIAlertView * alert=[[UIAlertView alloc]initWithTitle:#"Location" message:[NSString stringWithFormat:#"currentLocation==>%#",currentLocationUpcoming] delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil, nil];
[alert show];
[self.eventsTableView reloadData];
}
}];
}
}
i had same issue "UIAlertView Shows two times", but in my case it was because of coding error with long press gesture recognizer (different than original question, but may be useful for other folks that google uialertview showing twice). inside method to handle long press, i called method to show UIAlertView. my mistake was not recalling that handle long press method gets called twice each time user long presses (once for press and hold down, once when user releases their finger). the correct code recognizes gesture state (code below).
-(IBAction)handleHoldOnContact:(UILongPressGestureRecognizer*)sender {
if (sender.state == UIGestureRecognizerStateBegan){
// NSLog(#"UIGestureRecognizerStateBegan hold");
//Do Whatever You want on Began of Gesture
// ...
} else if (sender.state == UIGestureRecognizerStateEnded) {
// NSLog(#"UIGestureRecognizerStateEnded release");
//Do Whatever You want on End of Gesture
// ...
}
}
I too get the same issue. To overcome this problem, i done the following things. Get the alertview as global variable. And then,
if(!alertForCoordinate){
alertForCoordinate=[[UIAlertView alloc]initWithTitle:#"Coordinate" message:[NSString stringWithFormat:#"latitude==>%f\nlongitude==>%f",self.userLocation.coordinate.latitude,self.userLocation.coordinate.longitude] delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil,nil];
[alertForCoordinate show];
}
After that, when you clicking "OK" button from the Alertview. set that to nil. Like the following,
alertForCoordinate = nil;
Hope, this will help you.
It could be a case of duplicating a button, and therefore it's IBaction references, in main.storyboard.
I had a button that was styled perfectly in main.storyboard, so I alt drag duplicated it and attached a new IBaction to the viewController. I didn't realize it but when I tapped that new button it fired the IBaction for both the first button and the second button, because it was hooked up to both, as it was a duplicate of the first.
I right clicked the second button in main.storyboard, saw the reference to the IBaction from the first button AND the second, then deleted the reference to the first. Problem solved. What a nightmare. Hope this helps someone.

How to hook UIAlertView to actions?

I am creating a drawing application where the user can draw using their finger strokes. I am trying to make a button that asks the user if they would like to clear the canvas. This alert has two buttons "Yes" and "No". I have the alert view appearing correctly but I have spent all day trying to figure out how to hook the buttons up to actions. I have so far had no success even after reading and watching from many instructional sources. From everything that I have read I can't understand why it would not be working. I have included UIAlertViewDelegate in my .h file also.
Here is my alert view:
- (IBAction)clearButton:(id)sender {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Clear Canvas"
message:#"Are you sure?"
delegate:nil
cancelButtonTitle:#"No"
otherButtonTitles:#"Yes", nil];
[alert show];
}
Here is my clear canvas method:
- (void)clearCanvas:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1)
drawImage.image = nil;
}
Any help or pointers would be greatly appreciated! I'm self taught and still very much a beginner!
Thanks!
- (IBAction)clearButton:(id)sender {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Clear Canvas"
message:#"Are you sure?"
delegate:self
cancelButtonTitle:#"No"
otherButtonTitles:#"Yes", nil];
[alert show];
}
Notice the difference in the delegate parameter. You must conform to the delegate you have declared in the .h
Secondly, use the delegate method -alertView:clickedButtonAtIndex

Coco2d add UIalert or UITextField,first time can show normal ,but next show will badly show two times

Coco2d add UIalert,first time can show normal ,but next show will badly show two times,and when i add UITextField to cocos2d for input player information,when I leave this scene ,I 'm
sure UITextField have been release ,but in other scene this UITextField still on the screen
problem with UIAlert? I used it in many times in iOS game. Worked fine
UIAlertView* alert= [[[UIAlertView alloc] initWithTitle: #"Not Enough Coins!"
message: #"You need more Coins"
delegate: nil
cancelButtonTitle: #"Cancel"
otherButtonTitles:#"Ok", nil] autorelease];
[alert show];
For other UI elements, release it on leaving.
-(void)onExit
{
if(mytextBox)
{
[mytextBox removeFromSuperview];
}
[super onExit];
}

Resources