【问题标题】:how to pass multiple parameters with selector method [duplicate]如何使用选择器方法传递多个参数[重复]
【发布时间】:2014-07-01 12:56:39
【问题描述】:

我有一个以编程方式创建的滑块

UISlider *mySlider = [[UISlider alloc] initWithFrame:CGRectMake(30,mainCategory.frame.size.height+subCategory.frame.size.height+questionLabel.frame.size.height +offsetQuestion,433,38)];
[mySlider addTarget:self action:@selector(sliderAction::) forControlEvents:UIControlEventValueChanged];
[mySlider setBackgroundColor:[UIColor clearColor]];
mySlider.minimumValue = 0;
mySlider.maximumValue = 100;

mySlider.continuous = YES;
mySlider.value = 0;

但我需要将 questionID 参数发送到 sliderAction 方法 这是sliderAction方法:

-(void)sliderAction:(int)questionID :(id)sender
{
    int discreteValue = roundl([(UISlider*)sender value]);

    UILabel *mylabel = (UILabel *)[self.scrlview.superview viewWithTag:questionID];
    mylabel.text=[NSString stringWithFormat:@"%d",discreteValue];
    NSLog(@"%d",[sender tag]);
}

我不知道如何用 questionID 调用它

【问题讨论】:

  • 您可以使用 NSArray 或 NSDictionary 作为参数。看到这个链接-------stackoverflow.com/questions/8439052/…
  • 动作事件方法(例如处理按钮点击、滑块值变化等方法)只需带一个参数即可。请详细说明您要做什么(您从哪里得到这个 questionId?),我相信有人会帮助您。
  • 我想生成动态表单。如果问题类型例如滑块我创建它并添加到滚动视图。我还想用 uilabel 显示滑块的值。如果我静态添加标签标签,上面的代码可以正常工作。但它应该是动态的,并且可能有很多滑块问题。所以我需要通过 questionID 来知道我写的值是哪个标签
  • 如果我需要一个整数值并且我是你,我会使用 UIViewtag 属性传递一个值。
  • 是的,我试过了,但问题是当我创建一个滑块控件时,我还创建了一个标签控件来设置滑块的值。所以在 for 循环中它们都采用相同的标签,并且在 sliderAction 方法中 viewWithTag 给出了错误

标签: ios iphone objective-c ipad


【解决方案1】:

我会在这里做这样的事情:

UISlider *mySlider = [[UISlider alloc] initWithFrame:CGRectMake(30,mainCategory.frame.size.height+subCategory.frame.size.height+questionLabel.frame.size.height +offsetQuestion,433,38)];
[mySlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
[mySlider setBackgroundColor:[UIColor clearColor]];
mySlider.minimumValue = 0;
mySlider.maximumValue = 100;
mySlider.continuous = YES;
mySlider.value = 0;
mySlider.tag = // ... your question ID or whatever.

和:

- (void)sliderAction:(UISlider *)sender {

    NSInteger questionID = sender.tag;

    int discreteValue = roundl([(UISlider*)sender value]);
    UILabel *mylabel = (UILabel *)[self.scrlview.superview viewWithTag:questionID];
    mylabel.text = [NSString stringWithFormat:@"%d",discreteValue];
    NSLog(@"%d",[sender tag]);
}

【讨论】:

  • 是的,我试过了,但问题是当我创建一个滑块控件时,我还创建了一个标签控件来设置滑块的值。所以在 for 循环中它们都采用相同的标签,并且在 sliderAction 方法中 viewWithTag 给出了错误
  • 您可能希望为 UILabel 对象使用偏移量,例如UILabel 对象从1000 开始,UISlider 对象从0 开始,调用–viewWithTag: 方法时tag 值之间不会相互干扰,只需增加问题ID由1000 提供,这些将是您的标签的tag 值,例如tag 12UISider 将匹配 tag 1012UILabel 等...
  • 好的,可以帮助我:) 谢谢
【解决方案2】:

你不能让 UIControlEvents 选择器有多个参数。

但你可以这样做,

UISlider *mySlider = [[UISlider alloc] initWithFrame:CGRectMake(30,mainCategory.frame.size.height+subCategory.frame.size.height+questionLabel.frame.size.height +offsetQuestion,433,38)];

[mySlider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];

[mySlider setBackgroundColor:[UIColor clearColor]];
mySlider.minimumValue = 0;
mySlider.maximumValue = 100;

mySlider.continuous = YES;
mySlider.value = 0;





-(void)sliderAction:(id)sender
{

    [self slider:(UISlider *)sender withQuestionID:1 Or YourOwnValue here];

}


-(void)slider:(UISlider*)slider withQuestionID:(int)questionID
{

    int discreteValue = roundl([slider value]);

    UILabel *mylabel = (UILabel *)[self.scrlview.superview viewWithTag:questionID];
    mylabel.text=[NSString stringWithFormat:@"%d",discreteValue];
    NSLog(@"%d",[slider tag]);
}

【讨论】:

    【解决方案3】:

    不幸的是,您可以将单个对象作为参数传递。 所以你必须传递一个NSDictionary 并使用特定的键读取数据。

    【讨论】:

    • 您能举例说明如何将字典传递给 UISlider 操作方法吗?
    • 好的,我想发送一个整数和发件人。如何将这两个添加到字典中?
    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2013-02-03
    • 2013-03-10
    • 2016-04-18
    相关资源
    最近更新 更多