Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using UIAlertView in an NSObject

I'm having a terrible time getting a UIAlertView to work within my custom NSObject class. In the research I've done it appears it should be possible but here's what I've run into.

First, here's my code:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  NSLog(@"clickedButtonAtIndex: %d", buttonIndex);
}

-(void)testAlertView {
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"List Contains Items"
                    message:@"List contains items.  Remove all items & delete?"
                    delegate:self
                    cancelButtonTitle:@"No"
                    otherButtonTitles:@"Yes", nil];
  [alertView show];
}

If I set the delegate to self this code crashes as soon as I tap a button. If I set it to nil clickedButtonAtIndex is never called. I've tried with and without using the <UIAlertViewDelegate>.

I know someone will ask 'why are you doing this in NSObject instead of in your UIViewController?'. Primarily because I want to separate this code out so I can use it from multiple places in my app. But also because this is a small piece of a larger block of logic that makes sense to be on it's own.

Any ideas what I'm doing wrong?

Thanks, Rich

like image 800
rdfrahm Avatar asked Dec 26 '11 20:12

rdfrahm


2 Answers

I had the same problem using ARC. The root of the problem was the same. I solved it by putting my custom NSObject into a "strong" property to make sure the object exists as long as the calling object (an UIVIewCOntroller in my case) exists, so when the delegate of my alert view is called I still have my custom object around and the delegate method works fine.

like image 92
lfleon Avatar answered Sep 27 '22 20:09

lfleon


Add the NSObject as strong property:

#import "Logout.h" // is NSObject
.
.
.
@property (nonatomic, strong) Logout *logout;

Then you will get the delegatemethods called in your NSObject.

Don´t forget to register the delegate for the UIAlertView:

@interface Logout () <UIAlertViewDelegate>

and in your method:

UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"title" 
message:@"message" delegate:self cancelButtonTitle:@"cancel" 
otherButtonTitles:@"ok", nil];            

[a show];
like image 39
Markus Wilhelm Avatar answered Sep 27 '22 22:09

Markus Wilhelm