转发发件人参数

时间:2009-07-06 23:57:19

标签: iphone objective-c cocoa-touch xcode

我有一个接受发件人的方法,并使用UI按钮调用。如何将该对象转换为UIImageView?基本上我该如何重复使用按钮的代码。

- (IBAction)startClick:(id)sender { 
    button.animationImages = [NSArray arrayWithObjects:
                                       [UIImage imageNamed:@"Pic_1.png"],
                                       [UIImage imageNamed:@"Pic_2.png"],
                                       [UIImage imageNamed:@"Pic_3.png"],
                                       nil];
    [button setAnimationRepeatCount:1];
    button.animationDuration = 1;
    [button startAnimating];
}

4 个答案:

答案 0 :(得分:3)

我的第一反应是这样做可能是个错误。 UIButtonUIImageViewUIView的不同子类(而UIButtonUIControl的子类),因此他们唯一的共同点是{{1} } 方法。如果UIView确实是sender,则将其视为UIButton可能会导致错误,例如“无法识别的选择器已发送到实例”等。

通常,更清晰的解决方案是创建一个单独的方法,该方法是UIImageView的操作。 (与Java不同,Objective-C和Cocoa更喜欢不将基于事件类型的UI响应代码转换为单个方法 - 而是根据需要发生的操作在逻辑上组织代码。)

如果必须从按钮和图像视图中调用此方法,则可以将逻辑分开:

UIImageView

答案 1 :(得分:1)

我似乎认为你会这样做。

UIButton *button = (UIButton*) id;
// then do all you button code here.

这应该有效。否则,将功能更改为

可能更好
 (IBAction)startClick:(UIButton *)theButton

这种方式你想要投射按钮。

答案 2 :(得分:1)

你的按钮有插座吗?该按钮是唯一将发送-startClick的UI元素:?如果是这样,那么写下这样的动作方法:

- (IBAction)startClick:(id)sender { 
    NSParameterAssert(sender == self.startClickButton);
    if (sender == self.startClickButton) {
        UIButton *button = self.startClickButton;
        [...]
    }
}

如果您没有该按钮的插座/属性,您可以测试发件人的课程,并在适当时进行演员。

- (IBAction)startClick:(id)sender { 
    NSParameterAssert([sender isKindOfClass: [UIButton class]]);
    if ([sender isKindOfClass: [UIButton class]]) {
        UIButton *button = (UIButton *)sender;
        [...]
    }
}

最后,允许(在编译时)将任何消息发送到id类型的值。 (如果接收者没有响应该消息,您将在运行时获得异常。)但是,您不能使用点语法。

因此,如果您知道发件人始终是一个按钮,那么您可以编写您的方法而不需要进行投射。您将不得不使用消息发送语法而不是点语法。

[button setAnimationImages: [NSArray ...]];
[button setAnimationDuration: 1];

这一点很重要 - 点语法等同于消息发送语法 - 它不是神秘的。

答案 3 :(得分:0)

您可以使用以下内容获取按钮标签并确定单击了哪个标签:

NSLog(@“点击按钮:%@”,[[发件人titleLabel] text]);

我希望这会有所帮助。

苏雷什