Braydon Batungbacal
Braydon Batungbacal

Reputation: 1038

Delegating UIAlertView to another class / file? Not working?

so I'm new to iOS development and I'm trying to delegate the button click event to another class. Whenever I click a button on the alert, the app crashes and I get an error saying Thread_1 EXC_BAD_ACCESS.

This is my code.

// theDelegateTester.h
#import <UIKit/UIKit.h>

@interface theDelegateTester : UIResponder <UIAlertViewDelegate>
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;
@end

Implementation..

// theDelegateTester.m
#import "theDelegateTester.h"

@implementation theDelegateTester
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"Delegated");
}
@end

And here's the implementation for my view file..

#import "appleTutorialViewController.h"
#import "theDelegateTester.h"

@interface appleTutorialViewController ()
- (IBAction)tapReceived:(id)sender;
@end

@implementation appleTutorialViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}



- (IBAction)tapReceived:(id)sender {
    theDelegateTester *newTester = [[theDelegateTester alloc] init];
    UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Alert!" message:@"This is a delegated alert" delegate:newTester cancelButtonTitle:@"Close" otherButtonTitles:@"Cool!", nil];
    [myAlert show];
}
@end

Upvotes: 0

Views: 808

Answers (1)

DrummerB
DrummerB

Reputation: 40211

First of all, you should always start your class names with a capital letter, so you can differentiate between classes and instances or methods easily.

And you probably leak the delegate class. You should declare a strong/retained property TheDelegateTester *myDelegate in your view controller. Then in tapReceived: something like this:

- (IBAction)tapReceived:(id)sender {
    if (!self.myDelegate) {
        TheDelegateTester *del = [[TheDelegateTester alloc] init];
        self.myDelegate = del;
        [del release];
    }
    UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Alert!" message:@"This is a delegated alert" delegate:newTester cancelButtonTitle:@"Close" otherButtonTitles:@"Cool!", nil];
    [myAlert show];
    [myAlert release];
}

Upvotes: 1

Related Questions