can an (IBAction) method be sent a message?

你说的曾经没有我的故事 提交于 2019-12-13 03:00:55

问题


I want to delay between each output result for say, 1 second. The very last line of the following code is throwing an error "Use of undeclared identifier 'dealCard'", but I have declared it in the header file as shown below.

- (IBAction)startPause:(id)sender
{
    if ([self.deal length]>cardNum) {
        timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(dealCard) userInfo:nil repeats:NO];
        card.text = [NSString stringWithFormat:@"%i",cardNum];
        [timer fire];
    }
}


- (void) dealCard{
    NSLog(@"dealCard: %d: ", cardNum+self.randCut);
    cardNum=cardNum + 1;
    [self startPause:(id)dealCard];
}

header file is next.

- (IBAction) startPause:(id)sender ;
- (void) dealCard;

回答1:


This is just a compilation error because dealCard is not a variable in the dealCard method. You can pass a selector as an argument. That would be done like:

[self startPause:@selector(dealCard)];

or even

[self startPause:_cmd];

since _cmd gives you the current selector and you happen to be in dealCard. Note however that usually the "sender" parameter is not used for passing a selector, but an object. For example an instance of UIButton sending a message like:

- (IBAction)myButtonResponse:(id)sender;

would pass self for the sender parameter.




回答2:


You can call your IBAction method with

[self startPause:nil];

since the sender parameter is never used. Remember that dealCard is a method, which has a selector associated. It's not a property (not even an object), so you can't pass it as an argument using only its name.

You have a recursive problem, too. dealCard calls startPause:, and startPause: calls dealCard again. You should have a stop condition in dealCard to end the "two level" recursive calls.



来源:https://stackoverflow.com/questions/17034993/can-an-ibaction-method-be-sent-a-message

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!