i am using ASIHttpRequest in my iOS project. In the requestFail i am doing like this :
#pragma mark Erreur requête de connexion
- (void)requestFailed:(ASIHTTPRequest *)request
if([[request error] code] == ASIConnectionFailureErrorType )
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Erreur de connexion"
message:#"Connexion avec le serveur impossible : vérifiez vos paramètres réseaux."
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil];
[alert show];
}
else if ([[request error] code] == ASIRequestTimedOutErrorType)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Erreur de connexion"
message:#"La requête a expiré !"
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil];
[alert show];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Erreur de connexion"
message:#"Une erreur inconnue est survenue."
delegate:nil
cancelButtonTitle:#"Annuler"
otherButtonTitles:nil];
[alert show];
}
}
Now, i would like to replace all my UIAlertView with an imageView ( show to the user a special UIImageView to tell him that there is an error ( connexion failure....), and remove this imageView when there is not server error.
Resume : I would like to show an imageView when the request fail and remove this image view and relance the request ( How I can do this with ASIHtppRequest) ?
I think you can use a UIActionSheet to replace the UIAlertView because the ActionSheet can be handled like a UIView, so you can present the ActionSheet that contains your UIImageView. You can also use one of the buttons to dismiss the ActionSheet to reload your ASIHTTPRequest.
The following code shows you the UIActionSheet's delegate methods that allow you to add your UIImageView and trigger your request when the cancel button is clicked.
#pragma -
#pragma ActionSheet Delegate
- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
UIImageView * yourImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 55, 320, 100)];
//Configure yourImageView...
//Add picker to action sheet
[actionSheet addSubview:yourImageView];
// Release your yourImageView
[yourImageView release];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex != [actionSheet cancelButtonIndex])
{
// Call back your ASIHTTPRequest
}
}
Don't forget to implement the UIActionSheetDelegate in your .h file.
Good luck.
Related
Yes, I've already Googled this question and I've used the exact code, but that's still not working.
Here is my current Objective-C code:
- (IBAction)btnTemp:(id)sender
{
if (_deepSwitch.on == TRUE)
{
[self TempCleaner];
_progress.progress += 1;
}
UIAlertView *cleaned = [[UIAlertView alloc] initWithTitle:#"Done!" message:#"Your device is now clean. Restarting SpringBoard." delegate:nil cancelButtonTitle:#"Ok" otherButtonTitles:nil, nil];
[cleaned show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == [alertView cancelButtonIndex]) {
NSLog(#"clicked");
}
}
Why isn't this working? I've tried buttonIndex 0, and cancel button!
Set the alert view's delegate to self
UIAlertView *cleaned = [[UIAlertView alloc] initWithTitle:#"Done!" message:#"Your device is now clean. Restarting SpringBoard." delegate:self cancelButtonTitle:#"Ok" otherButtonTitles:nil, nil];
Also, make sure that the class from which you are presenting the alert view declares the UIAlertViewDelegate protocol
//YourClass.h
#interface YourClass : SuperClass <UIAlertViewDelegate>
I am new to iPhone apps development. In my code, in first ViewController1 I have a textfield and a ok- button. So here
When I click ok button without entering a string, it shows an alert message.
When I enter the string and then press ok button, it should navigate to next ViewController2.
I am able to do the 1st part correctly when I have not connected the ok-button to the ViewController2 in Interface Builder. But when I connect, it navigates and then shows alert message.
Please tell me how to navigate to ViewController2 programmatically after I enter the string and press ok button.
This is how my code looks for Ok- button:
-(IBAction) okButton: (id) sender
{
if([textfield.text isEqualToString:#""])
{
UIAlertView *alert= [[UIAlertView alloc] initWithTitle:#"Warning!!" message:#"Enter the file name" delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil];
[alert show];
}
else if(textfield.text!= nil)
{
foldername1= [[NSString alloc] initWithString:[NSString stringWithString:textfield.text]];
NSLog(#"foldername is: %#", foldername1);
}
ViewController2 *view2= [[ViewController2 alloc] initWithNibName:#"Next View Name" bundle:nil];
[self.navigationController pushViewController:view2 animated:YES];
}
Segue-based navigation:
Remove the segue connecting OK button to View Controller 2 and add a manual segue between View Controller 1 and View Controller 2. Then implement the following code:
-(IBAction) okButton: (id) sender
{
if(textfield.text.length == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Warning!!"
message:#"Enter the file name"
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil];
[alert show];
}
else
{
foldername1 = textfield.text;
NSLog(#"foldername is: %#", foldername1);
[self performSegueWithIdentifier:#"segueIdentifier" sender:self];
}
}
Code-based navigation:
-(IBAction) okButton: (id) sender
{
if(textfield.text.length == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Warning!!"
message:#"Enter the file name"
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil];
[alert show];
}
else
{
foldername1 = textfield.text;
NSLog(#"foldername is: %#", foldername1);
ViewController2 *view2 = [[ViewController2 alloc] initWithNibName:#"Next View Name"
bundle:nil];
[self.navigationController pushViewController:view2 animated:YES];
}
}
This assumes you're using ARC and that foldername1 is a strong ivar / property.
If you assign a segue to a button, then you should not give it a click handler. Simply remove the segue from the button and the code should be Ok since you are using pushViewController:animated: to navigate instead of navigating with a segue.
Normally you would create a segue from view controller 1 to viwe controller 2, name it with an identifier, and activate that in code with the performSegueWithIdentifier:sender: method. Like this:
[self performSegueWithIdentifier:#"selectedIdentifierForTheSegue" sender:self];
For more info this is a pretty good tutorial for implementing navigation: http://www.appcoda.com/storyboards-ios-tutorial-pass-data-between-view-controller-with-segue/
just writedown
return;
below [alert show]; line then it just shows an alert and not navigate to the nextview.
try this
(IBAction) okButton: (id) sender
{
if(textfield.text.length==0)
{
UIAlertView *alert= [[UIAlertView alloc] initWithTitle:#"Warning!!" message:#"Enter the file name" delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil];
[alert show];
}
else if(textfield.text.length!=0)
{
foldername1= [[NSString alloc] initWithString:[NSString stringWithString:textfield.text]];
NSLog(#"foldername is: %#", foldername1);
}
ViewController2 *view2= [[ViewController2 alloc] initWithNibName:#"Next View Name" bundle:nil];
[self.navigationController pushViewController:view2 animated:YES];
}
To push view controller:
ViewController2 *vc2 = [[ViewController2 alloc] initWithNibName:#"ViewController2"
bundle:nil];
[self.navigationController pushViewController:vc2 animated:YES];
And also check this.
I have troubles when I perform a UIAlertView, (the alert view works fine) but... i cannot perform the segue to another window... the type of transition is modal... any help?
if([txtPeticion hasText] )
{
alertaVeladora = [[UIAlertView alloc]
initWithTitle:#"Santuario Virtual"
message:#"Gracias por compartir tu veladora!"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:nil];
[alertaVeladora show];
[self postMessage:txtPeticion.text shareTw:shareTwitter shareFb:shareFacebook withEmail:email];
txtPeticion.text = #"";
[self performSelector:#selector(dismissAlert:) withObject:alertaVeladora afterDelay:1.0f];
}
If I understand correctly, you want to perform the segue when the user presses the dismiss button on the AlertView? To perform an action when the button has been pressed, use the following code:
if([txtPeticion hasText] )
{
alertaVeladora = [[UIAlertView alloc]
initWithTitle:#"Santuario Virtual"
message:#"Gracias por compartir tu veladora!"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:nil];
[alertaVeladora show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(alertView.tag == 1)
{
// Perform Segue
[self performSegueWithIdentifier: #"MySegue" sender: self];
}
}
I want two alert views to show up only when the user opens my application for the first time -- the second to appear after the first is dismissed. I have it set up to only show the UIAlertViews when it has not been shown before and I do not need help with this. I need help figuring out how to display two alert views in a row when this is the case.
-(void) alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex does not work for me.
Here is the code I have -- remember this is in didFinishLaunchingWithOptions:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL didFirstLaunch = [defaults boolForKey:#"DidFirstLaunch"];
if (!didFirstLaunch) {
[defaults setBool:YES forKey:#"DidFirstLaunch"];
UIAlertView *successAlert = //not important
[successAlert show];
[successAlert release];
//Somehow show second alert after the first is dismissed
}
I'm gonna post a very simple solution using GCD & blocks (GCD part is just in case the alert view is created on another thread then the main thread, callback should be safe to perform on the main thread). Remember, I just coded this in like 5 mins, so you definitely should work on improving the code. One thing that's a bit ugly is the delegate parameter that is overridden in my subclass. The interface of the subclass could be changed a bit to make it more obvious of what happens ...
Anyway, here goes ...
First create a subclass of UIAlertView, make it look somewhat like the following ...
#interface FSAlertView () <UIAlertViewDelegate>
#property (nonatomic, copy) void (^dismissHandler)(NSInteger buttonIndex);
#end
#implementation FSAlertView
#synthesize dismissHandler = _dismissHandler;
- (void)showWithDismissHandler:(void (^)(NSInteger buttonIndex))dismissHandler
{
self.dismissHandler = dismissHandler;
self.delegate = self;
[self show];
}
// Alert view delegate
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
dispatch_async(dispatch_get_main_queue(), ^ {
if (_dismissHandler)
{
_dismissHandler(buttonIndex);
}
});
}
Now in the app we can create alert views like the following ...
FSAlertView *alert1 = [[FSAlertView alloc] initWithTitle:#"Alert 1"
message:#"Some message"
delegate:nil
cancelButtonTitle:#"Cancel"
otherButtonTitles:#"Show 2nd Alert", nil];
[alert1 showWithDismissHandler:^ (NSInteger buttonIndex) {
NSLog(#"button pressed: %d", buttonIndex);
if (buttonIndex == 1)
{
UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:#"Alert 2"
message:#"Hi!"
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil];
[alert2 show];
}
}];
If i understand your question correctly , then this may help:
UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:#"Alert 1" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
[firstAlert show];
[self performSelector:#selector(test:) withObject:firstAlert afterDelay:2];
[firstAlert release];
UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:#"Alert 2" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
[secondAlert show];
[self performSelector:#selector(test:) withObject:secondAlert afterDelay:2];
[secondAlert release];
-(void)test:(UIAlertView*)alert{
[alert dismissWithClickedButtonIndex:-1 animated:YES];
}
This will show two alert views one after the other.
NOTE: I am not sure if you are dismissing the alerts with cancel button so i am dismissing them automatically after few seconds.
Try this:
UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:#"Title" message:#"Message" delegate:self cancelButtonTitle:#"Cancel" otherButtonTitles:#"Ok", nil];
[firstAlert setTag:444];
[firstAlert show];
firstAlert = nil;
AlertView Delegate Method:
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
switch (alertView.tag) {
case 444:
{
//Cancel ButtonIndex = 0
if (buttonIndex == 1) {
UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:#"Title 2" message:#"Message2" delegate:self cancelButtonTitle:#"Cancel" otherButtonTitles:#"Dismiss", nil];
[secondAlert setTag:555];
[secondAlert show];
secondAlert = nil;
}
}
break;
case 555:
{
if (buttonIndex == 1) {
NSLog(#"Code Here");
}
}
break;
}
}
Hi guys i have this i IBAction linked to a button:
- (IBAction)showCurl:(id)sender {
alert1 = [[UIAlertView alloc]initWithTitle:#"Loading" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[alert1 show];
}
and a clickedButtonIndex to auto run but somehow it doesn't load SecondViewController:
#pragma mark UIAlertView
- (void)alertView:(UIAlertView *)alert1 clickedButtonAtIndex:(NSInteger)buttonIndex {
if(buttonIndex == 0){
SecondViewController *sampleView = [[SecondController alloc] init];
[sampleView setModalTransitionStyle:UIModalTransitionStylePartialCurl];
[self presentModalViewController:sampleView animated:YES];
}
else{
// Cancel prompt
}
}
Am i missing something here?
If you don’t give the alert view some button titles, there won’t be any buttons to tap on and that delegate method won’t get called.
- (IBAction)showCurl:(id)sender {
alert1 = [[UIAlertView alloc] initWithTitle:#"Loading" message:nil delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[alert1 show];
}
Your code doesn't show a button
alert1 = [[UIAlertView alloc]initWithTitle:#"Loading" message:nil delegate:self cancelButtonTitle:**nil** otherButtonTitles:**nil**];
You pass nil as cancelButtonTitle AND nil as otherbuttonTitles, you should at least have one button title set.