我有一个接受发件人的方法,并使用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];
}
答案 0 :(得分:3)
我的第一反应是这样做可能是个错误。 UIButton
和UIImageView
是UIView
的不同子类(而UIButton
是UIControl
的子类),因此他们唯一的共同点是{{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]);
我希望这会有所帮助。
苏雷什