【问题标题】:Objective-C @Selector(methodWithArguments) [duplicate]Objective-C @Selector(methodWithArguments) [重复]
【发布时间】:2012-07-17 15:18:01
【问题描述】:

可能重复:
Arguments in @selector

这可能是一个非常简单的问题,但我需要一个非常好的答案......

使用以下代码,我可以在单击按钮时调用方法...

[pushButton addTarget:self action:@selector(pushOrPull:andVI:) forControlEvents:UIControlEventTouchUpInside];
[pullButton addTarget:self action:@selector(pushOrPull:andVI:) forControlEvents:UIControlEventTouchUpInside];

方法如下...

-(void) pushOrPull: (int)pushPull andVI: (NSString *) videoId {

}

我希望按钮能够为该方法提供参数,但是当我尝试这个时......

[pushButton addTarget:self action:@selector(pushOrPull:2 andVI:@"someVID") forControlEvents:UIControlEventTouchUpInside];
[pullButton addTarget:self action:@selector(pushOrPull:1 andVI:@"someVID") forControlEvents:UIControlEventTouchUpInside];

Xcode 给了我两个错误:"expected )"

当我的按钮被点击时,如何向方法提供这两个参数?

【问题讨论】:

  • @Almo 不,不是重复的按钮不能计时!我不知道用户什么时候会点击按钮?
  • 选择器不是这样工作的 :-)
  • 那么有什么方法可以在按钮点击时调用方法(带参数)?
  • Shane 的回答 (stackoverflow.com/questions/1018195/…) 不能解决您的问题吗?
  • 你不能使用 NSInvokation?这是欺骗的重要部分。不是计时器。如果我有这个错误,那么我很抱歉。

标签: iphone objective-c ios


【解决方案1】:

你可以做的只是中间有一个方法。

[pushButton addTarget:self action:@selector(runMyMethod) forControlEvents:UIControlEventTouchUpInside];
pushButton.tag =0;
[pullButton addTarget:self action:@selector(runMyMethod) forControlEvents:UIControlEventTouchUpInside];
pullbutton.tag =1;

-(void) runMyMethod:(id)sender {
    if(sender.tag ==0)
    {
       [self pushOrPull:1 andVI:@"someVID"];
    }
    else if (sender.tag ==1)
    {
       [self pushOrPull:2 andVI:@"someVID"];
    }
}
-(void) pushOrPull: (int)pushPull andVI: (NSString *) videoId {

}

【讨论】:

    【解决方案2】:

    很遗憾,你不能。按钮只“知道如何”将自己作为第一个参数发送。最好的办法是让按钮“属于”某个可以解释按钮按下的视图控制器(它们向其发送事件),然后在其他地方调用委托方法,并根据需要使用尽可能多的参数。

    要回答一个相关问题,“选择器”从不携带实际参数,但它确实每个参数携带一个冒号:@selector(aMethodWithThis:andThat:)

    【讨论】:

      【解决方案3】:

      这样好一点:

      // set up an NSMutableDictionary, videoIDsForButtons as an iVar or property
      [pushButton addTarget:self action:@selector(buttonWasPressed:) forControlEvents:UIControlEventTouchUpInside];
      [videoIDsForButtons setObject: @"someVID" forKey: pushButton];
      
      [pullButton addTarget:self action:@selector(buttonWasPressed:) forControlEvents:UIControlEventTouchUpInside];
      [videoIDsForButtons setObject: @"someVID" forKey: pullButton];
      

       

      - (void)buttonWasPressed:(id)sender
      {
          if (sender == pushButton)
          {
              [self pushOrPull: 2 andVI: [videoIDsForButtons objectForKey: sender]];
          }
          else // assume pullButton
          {
              [self pushOrPull: 1 andVI: [videoIDsForButtons objectForKey: sender]];
          }
      }
      

      这是因为选择器不带参数,只有方法调用可以。当按下按钮时,它会将自己作为唯一的参数 (sender)。您应该有一个完全独立的响应者方法来查看发件人并确定适当的追索权。

      【讨论】:

      • 谢谢,但问题是:在调用选择器方法之前我可以做这样的事情吗... pushButton.videoID = @"someVID"; .... 然后在 buttonWasPressed 方法中引用它?
      • 啊。好吧,您可以将按钮子类化,但这有点多。如果我的样本,我会提供替代方案。
      • 抱歉,不,我有 20 个推拉按钮……我在创建表视图时创建选择器……
      • 或者它仍然可以工作???
      • 您真的需要重新考虑这里的数据设置,因为选择器根本不是那样工作的。
      【解决方案4】:

      不幸的是,-addTarget:action:forControlEvents: 可以通过以下方法回拨您,仅使用下一个参数:

      -(IBAction)selector:(id)sender forEvent:(UIEvent *)event;
      

      所以,您应该在此方法内部检查哪个对象触发了事件 (sender),然后在此方法内部,您可以使用所需的参数调用您自己的 -pushOrPull:andVI: 方法,或者您可以设置两个不同的回调方法,然后您不必检查sender 参数,只需调用您的-pushOrPull:andVI: 像这样

      {
          // ...
      
          [pushButton addTarget:self action:@selector(pushButtonTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside];
          [pullButton addTarget:self action:@selector(pullButtonTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside];
      
          // ...
      
      }
      
      - (IBAction)pushButtonTouchedUpInside:(id)sender {
          [self pushOrPull:2 andVI:@"someVID"];
      }
      
      - (IBAction)pullButtonTouchedUpInside:(id)sender {
          [self pushOrPull:1 andVI:@"someVID"];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        • 2023-04-08
        • 2015-08-25
        • 2014-08-23
        • 2012-10-28
        • 2014-03-08
        相关资源
        最近更新 更多