Vijayeta
Vijayeta

Reputation: 5655

How can I pass a parameter to this function?

I have the following code:

[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside];

- (void)replyAll:(NSInteger)tid {
// some code
}

How can I send a parameter to the ReplyAll function?

Upvotes: 10

Views: 20227

Answers (6)

Vijayeta
Vijayeta

Reputation: 5655

It's working now :D.

{
NSInteger tid = [sender tag];
}

Upvotes: 2

Rob Fonseca-Ensor
Rob Fonseca-Ensor

Reputation: 15621

The replyAll method should accept (id)sender. If a UIButton fired the event, then that same UIButton will be passed as the sender. UIButton has a property "tag" that you can attach your own custom data to (much like .net winforms).

So you'd hook up your event with:

[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside];
replyAllBtn.tag=15;

then handle it with:

(void) ReplyAll:(id)sender{
    NSInteger *tid = ((UIControl*)sender).tag;
    //...

Upvotes: 21

lostInTransit
lostInTransit

Reputation: 71047

If you want to send an int value, set the tag of the button = the int value you want to pass. Then you can access the tag value of the button to get the int you wanted.

NSInteger is not a pointer. Try this

NSInteger tid = sender.tag;

Upvotes: 2

Dan Keen
Dan Keen

Reputation: 129

There's a few good ways to do this. The two most commonly implemented would be to have the controller (who's receiving the action) know about possible senders, or having the sender itself have a method that you end up using to determine the proper behavior.

The first (my preferable way, but it's easy to argue the opposite) would be implemented like such:

@interface Controller : NSObject {
    UIButton *_replyToSender;
    UIButton *_replyToAll;
}
- (void)buttonClicked:(id)sender;
@end

@implementation Controller
- (void)buttonClicked:(id)sender {
    if (sender == _replyToSender) {
         // reply to sender...
    } else if (sender == _replyToAll) {
         // reply to all...
    }
}
@end

The second way would be implemented in a manner such as:

typedef enum {
    ReplyButtonTypeSender = 1,
    ReplyButtonTypeAll,
} ReplyButtonType;

@interface Controller : NSObject {
}
- (void)buttonClicked:(id)sender;
@end

@interface MyButton : UIButton {
}
- (ReplyButtonType)typeOfReply;
@end

@implementation Controller
- (void)buttonClicked:(id)sender {
    // You aren't actually assured that sender is a MyButton, so the safest thing
    // to do here is to check that it is one.
    if ([sender isKindOfClass:[MyButton class]]) {
        switch ([sender typeOfReply]) {
            case ReplyButtonTypeSender:
                // reply to sender...
                break;
            case ReplyButtonTypeAll:
                // reply to all...
                break;
        }
    }
}
@end

Upvotes: 0

MLefrancois
MLefrancois

Reputation: 768

A selector function will normally be defined as such:

- (void) ReplyAll:(id)sender;

So the only parameter an action will ever receives is the actual control that called it. You could just add a property to your control that can be read in replyAll

Upvotes: 2

Thomas Tempelmann
Thomas Tempelmann

Reputation: 12145

The MVC model used in Cocoa works differently. Basically, the idea is that a control (=view) such as a button only lets a function know it was pressed, not knowing what this means. The function then has to know all the dynamics and dependencies. In your case, it's the function that has to find the parameter. To accomplish that, you'll "bind" other objects to the function (= controller).

I suggest you read a few Cocoa tutorials first if you want to get ahead with iPhone programming.

Upvotes: 1

Related Questions