Several UIAlertViews for a delegate
Asked Answered
S

5

37

Currently I've got a class popping up UIAlertViews here and there. Currently, the same class is the delegate for these (it's very logical that it would be). Unfortunately, these UIAlertViews will call the same delegate methods of the class. Now, the question is - how do you know from which alert view a delegate method is invoked? I was thinking of just checking the title of the alert view, but that isn't so elegant. What's the most elegant way to handle several UIAlertViews?

Stoltzfus answered 26/2, 2010 at 0:0 Comment(0)
V
100

Tag the UIAlertViews like this:

#define kAlertViewOne 1
#define kAlertViewTwo 2

UIAlertView *alertView1 = [[UIAlertView alloc] init...
alertView1.tag = kAlertViewOne;

UIAlertView *alertView2 = [[UIAlertView alloc] init...
alertView2.tag = kAlertViewTwo;

and then differentiate between them in the delegate methods using these tags:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(alertView.tag == kAlertViewOne) {
        // ...
    } else if(alertView.tag == kAlertViewTwo) {
        // ...
    }
}
Vivle answered 26/2, 2010 at 0:47 Comment(8)
Ah, nice. Though I'd use a switch. :)Stoltzfus
of course a switch would work too, but I never liked switch. =)Board
Great answer. But that leads me to another question. Why do you define the kAlertViewOne 1 and kAlertViewRwo 2. Couldn't you just use in the alertView.tag = 1 or alertView.tag = 2? Is this done for a reason?Crymotherapy
kAlertViewOne and kAlertViewTwo make more sense than 1 or 2. for example, in your question, you can use kAlertResume and kAlertRetry, and they'd be more readable than two random numbers.Board
Is there a reason you would not have them strings?Crymotherapy
tag is defined as an NSInteger.Board
FYI, assigning tags the numbers less than 10 might conflict with those Apple rarely uses.Schuck
Incidentally you can cast a NSString * into a NSInteger and read it back later. However that may be too kludgy for some.Macaronic
I
4

FYI, if you want to target just iOS 4 users (which is reasonable now that ~98.5% of clients have at least iOS 4 installed), you should be able to use Blocks to do really nice inline handling of UIAlertViews.

Here's a Stackoverflow question explaining it:
Block for UIAlertViewDelegate

I tried using Zachary Waldowski's BlocksKit framework for this. His UIAlertView(BlocksKit) API reference looked really good. However, I tried to follow his instructions to import the BlocksKit framework into my project, but unfortunately I couldn't get it to work.

So, as Can Berk Güder suggests, I've used UIAlertView tags for now. But at some point in future I'm going to try to move to using Blocks (preferably one which supports ARC out of the box)!

Indraft answered 16/4, 2012 at 2:22 Comment(1)
If you're using iOS 8+, UIAlertController has block based delegate methods.Dogged
M
3

easier & newer

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 1;

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 2;



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(alertView.tag == 1) {
        // first alert...
    } else  {
        // sec alert...
    }
}

all done!

Mikimikihisa answered 10/8, 2013 at 20:8 Comment(0)
E
1

You can overcome this whole ordeal and prevent yourself from using tags by enhancing UIAlertView to use block callbacks. Check out this blog post I wrote on the subject.

Expensive answered 31/1, 2013 at 21:55 Comment(0)
D
0

I've always thought using tags is a bit of a hack. If you do use them, at least set some defined constants for the tag numbers.

Instead, I use properties like this:

In the interface section:

@property (nonatomic, weak) UIAlertView *overDueAlertView;
@property (nonatomic, weak) UIAlertView *retryPromptAlertView;

Creating the alert view:

UIAlertView *alert = [[UIAlertView alloc] init...
self.overDueAlertView = alert;
[alert show];

Delegate method:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  if (alertView == self.overDueAlertView) {
    // Overdue alert
  } else if (alertView == self.retryPromptAlertView) {
    // Retry alert
  }
Dogged answered 11/8, 2015 at 14:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.