2
votes

I have a button in my UIView that is created like so:

UIBarButtonItem *editButton = 
        [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit 
                                                      target:self       
                                                      action:@selector(toggleEdit)];
self.navigationItem.rightBarButtonItem = editButton;
[editButton release];

And this is the action method:

-(void) toggleEdit:(id)sender
{
}

but I get this error

2011-09-02 15:27:13.362 blubb[15006:207] -[DatabaseSelectionViewController toggleEdit]: unrecognized selector sent to instance 0x5a29d80 2011-09-02 15:27:13.365 blubb[15006:207] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DatabaseSelectionViewController toggleEdit]: unrecognized selector sent to instance 0x5a29d80'

Why is this happening?

7

7 Answers

7
votes

The correct name for your selector is

@selector(toggleEdit:)

Without the : it would look for a method with this signature:

-(void) toggleEdit  // No parameters
{
}

When you actually have declared:

-(void) toggleEdit:(id)sender
{
}
5
votes

Change

@selector(toggleEdit)

to

@selector(toggleEdit:)
2
votes

For anyone else stumbling across this, you can also receive those "unrecognized selector sent to instance 0x..." errors when you no longer own something and the statement is pointing to some junk address in memory.

1
votes

should be:

-(IBAction) toggleEdit:(id)sender {}

and

@selector(toggleEdit:)
1
votes

Try:

UIBarButtonItem *editButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemEdit
target:self action:@selector(toggleEdit) forControlEvents:UIControlEventTouchUpInside];
1
votes

The method you're trying to use takes an argument, which means that it has a colon in its name -- the colon is actually part of the name. You need to include that colon when you get the selector:

@selector(toggleEdit:)

Refer to the Message Syntax section of The Objective-C Programming Language:

A selector name includes all the parts of the name, including the colons, so the selector in the preceding example is named setOriginX:y:. It has two colons, because it takes two parameters. The selector name does not, however, include anything else, such as return type or parameter types.

0
votes

If you are using a storyboard. Sometimes it helps to remove the button from the storyboard, and put a new button, and make the necessary connections.