Richard Knop
Richard Knop

Reputation: 83695

Cannot show UIAlertView with a text field

This piece of code which is supposed to show an alert window with a text input:

self.alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"How are you?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
self.alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[self.alert show];

Causes this error:

Thread 7: Program received signal: "EXC_BAD_ACCESS"

This is how self.alert is defined:

@interface MyClass : NSObject
{
    UIAlertView *alert;
    id <MyClassDelegate> __unsafe_unretained delegate;
}

@property (nonatomic, retain) UIAlertView *alert;
@property (unsafe_unretained) id <MyClassDelegate> delegate;

Upvotes: 0

Views: 945

Answers (2)

araferna
araferna

Reputation: 71

The EXC_BAD_ACCESS is caused by accessing a released object. To avoid this make your call to UIAlertView kind of modal:

Function body:

-(void)checkSaving
{
    UIAlertView *alert = [[UIAlertView alloc]
        initWithTitle:@"Do you want to add these results to your database?"
        message:@"\n\n"
        delegate:self
        cancelButtonTitle:@"No"
        otherButtonTitles:@"Save", nil];

    alert.alertViewStyle = UIAlertViewStyleDefault;
    [alert show];

    //this prevent the ARC to clean up :
    NSRunLoop *rl = [NSRunLoop currentRunLoop];
    NSDate *d;
    d= (NSDate*)[d init];
    while ([alert isVisible]) 
    {
     [rl runUntilDate:d];

    }
}

Your choice result:

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    // the user clicked one of the OK/Cancel buttons

    if (buttonIndex == 1)//Save
    {
        //do something

    }
    if (buttonIndex == 0)//NO
    {
        //do something
    }
}

Register the functions in the interface declaration:

@interface yourViewController ()
    -(void)checkSaving
    - (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
//...
@end

To call:

[self checkSaving];

I wish this will help you.

Upvotes: 0

ggrana
ggrana

Reputation: 2335

The problem is maybe because of the customize.

I do not know why, but appear to me that the problem is because of the use of threads + customize of your alert.

Can you try to show this alert on the main thread? What happen?

You probably get an error in this line: self.alert.alertViewStyle = UIAlertViewStylePlainTextInput;

What you need to do if yes, is perform this in the main thread.

- (void) yourMethod{
    [self performSelectorOnMainThread:@selector(yourMethod2) withObject:nil waitUntilDone:NO];
}

- (void) yourMethod2{
    self.alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"How are you?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
    self.alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    [self.alert show];
}

Sorry to can't help you more than that, but I do not know exactly what happen, but I already read about issues when editing things to show, in other threads.

Hope it help you!

Upvotes: 1

Related Questions