开发者

Pressing UIButton results in Unrecognized Selector error

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:2开发者_运维百科7: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?


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
{
}


Change

@selector(toggleEdit)

to

@selector(toggleEdit:)


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.


should be:

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

and

@selector(toggleEdit:)


Try:

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


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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜