2011-03-23 55 views
8

您好,这是一个很容易解决的问题。iOS - 在具有参数的按钮上调用选择器

我试图做的是有一个按钮动作的选择器,调用我的其他方法与电影的文件名发挥。如果我将文件名称移回该方法,它可以完美地工作。

我相信我绊倒了将选择器添加到按钮的正确方法。任何意见/建议或建议,将不胜感激。

在此先感谢。

一个UIControl(UIButton的是一个)的
//The Button 
    infobuttonTwo   = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    infobuttonTwo.frame  = CGRectMake(405, 204, 49, 58); 
    [infobuttonTwo addTarget:self 
         action:@selector(buttonInfo:) withObject:@"VTS_02_1" 
      forControlEvents:UIControlEventTouchUpInside]; 



//The Method It's calling 
-(void)buttonInfo:(NSString *) fileName { 



//The Error it's showing. 
-[UIRoundedRectButton addTarget:action:withObject:forControlEvents:]: unrecognized selector sent to instance 0x660e9e0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIRoundedRectButton addTarget:action:withObject:forControlEvents:]: unrecognized selector sent to instance 0x660e9e0' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x011bfbe9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x013145c2 objc_exception_throw + 47 
    2 CoreFoundation      0x011c16fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x01131366 ___forwarding___ + 966 
    4 CoreFoundation      0x01130f22 _CF_forwarding_prep_0 + 50 
    5 bCIT        0x000054f3 -[TrailersViewController popButtons] + 647 
    6 bCIT        0x0000444b -[TrailersViewController right] + 437 
    7 bCIT        0x00003b2d -[TrailersViewController handleSwipeFrom:] + 191 
    8 UIKit        0x005559c7 -[UIGestureRecognizer _updateGestureWithEvent:] + 727 
    9 UIKit        0x005519d6 -[UIGestureRecognizer _delayedUpdateGesture] + 47 
    10 UIKit        0x00557fa5 _UIGestureRecognizerUpdateObserver + 584 
    11 UIKit        0x0055818a _UIGestureRecognizerUpdateGesturesFromSendEvent + 51 
    12 UIKit        0x002f36b4 -[UIWindow _sendGesturesForEvent:] + 1292 
    13 UIKit        0x002eef87 -[UIWindow sendEvent:] + 105 
    14 UIKit        0x002d237a -[UIApplication sendEvent:] + 447 
    15 UIKit        0x002d7732 _UIApplicationHandleEvent + 7576 
    16 GraphicsServices     0x01af5a36 PurpleEventCallback + 1550 
    17 CoreFoundation      0x011a1064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 
    18 CoreFoundation      0x011016f7 __CFRunLoopDoSource1 + 215 
    19 CoreFoundation      0x010fe983 __CFRunLoopRun + 979 
    20 CoreFoundation      0x010fe240 CFRunLoopRunSpecific + 208 
    21 CoreFoundation      0x010fe161 CFRunLoopRunInMode + 97 
    22 GraphicsServices     0x01af4268 GSEventRunModal + 217 
    23 GraphicsServices     0x01af432d GSEventRun + 115 
    24 UIKit        0x002db42e UIApplicationMain + 1160 
    25 bCIT        0x000029b4 main + 102 
    26 bCIT        0x00002945 start + 53 
) 
terminate called after throwing an instance of 'NSException 

回答

4

那么,你的问题是,addTarget:action:withObject:forControlEvents:不是在UIControl存在的方法。您需要找到一些其他方式来跟踪您的对象值,无论是伊娃,一些中间数据源还是其他东西。

有一段时间similar question有一些建议。

+0

怕是这样的......想这意味着我只需要调用,调用我想调用的方法的另一种方法。 – Mytheral 2011-03-23 14:31:28

17

动作可以有三种不同的方法签名:

- (void)action 
- (void)action:(id)sender 
- (void)action:(id)sender event:(UIEvent *)event 

所以你试着做什么是不可能的。您无法使用UIControlEvent发送自定义对象。

也许像这样的东西是解决您的问题。

-(void)buttonInfo:(id)sender { 
    NSString *fileName = nil; 
    if (sender == infobuttonTwo) { 
     fileName = @"VTS_02_1"; 
    } 
} 

,当然你必须改变你的不对了addTarget方法

[infobuttonTwo addTarget:self action:@selector(buttonInfo:) forControlEvents:UIControlEventTouchUpInside]; 
4

你可以这样做:

buttonInfo.tag = 1; 

-(void)buttonInfo:(id)sender { 
     if(sender.tag == 1){ 
     NSString filename = @"VTS_02_1"; 
     } 
    } 

...

+0

这种方法不适用于我..它说要求memeber TAG不是sumthing工会或struncture。 – Christina 2011-06-09 14:49:31

0
[infobuttonTwo addTarget:self action:@selector(buttonInfo:)forControlEvents:UIControlEventTouchUpInside]; 
-2

我该解决方案是创建一个全局变量,将持有的对象。

5

检查了这一点..

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    // Do any additional setup after loading the view, typically from a nib. 
    int y = 100; 

    for (int i = 0; i <= 5; i++) { 
     UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     [button addTarget:self action:@selector(aMethod:) 
        forControlEvents:UIControlEventTouchDown]; 
     [button setTitle:@"Show View" forState:UIControlStateNormal]; 
     button.frame = CGRectMake(80, y, 160, 40); 
     [button setTitle:[NSString stringWithFormat:@"Button-%i", i] 
              forState:UIControlStateNormal]; 
     [self.view addSubview:button]; 
     y = y + 60; 
    } 
} 

- (void)aMethod:(id)sender { 

    UIButton *button = sender; 

    int y = 100; 
    int i = 5; 

    for (int x = 0; x <= i; x++) { 
     NSString *frameString = 
      [NSString stringWithFormat:@"{{80, %i}, {160, 40}}", y]; 

     if ([NSStringFromCGRect(button.frame) isEqualToString:frameString]) { 
      NSLog(@"button %i clicked..", x); 
     } 
     y = y + 60; 
    } 
} 
+0

上面的代码运行良好。, – Sri 2012-09-19 14:13:56

+0

Wat?比较帧的NSString表示形式?这是一个新的。非常有创意:-) – 2013-07-24 16:58:07