我有一个UIButton,它将draginside事件发送到:
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
它通过viewDidLoad中的以下代码执行此操作:
[colourButton1 addTarget:self action:@selector(touchesBegan:withEvent:) forControlEvents:UIControlEventTouchDown];
在它发送给它的方法中,有以下行:
UITouch *myTouch = [touches anyObject];
由于某种原因,当在UIButton中拖动时,这会导致应用程序崩溃。有什么想法吗?
编辑:解决方案..
-(IBAction)buttonDragged:(id)button withEvent:(UIEvent*)event {
NSSet *touches = [event touchesForView:colourButton1];
[self touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event];
}
答案 0 :(得分:4)
当您将目标添加到控件时,您可以传递3种类型的选择器以进行操作 -
- (void)action
- (void)action:(id)sender
- (void)action:(id)sender withEvent:(UIEvent*)event
名称无关紧要,重要的参数数量。如果控制向它的目标发送一个带有2个参数的消息,则第一个参数将控制自身(在您的情况下为UIButton
的实例),第二个参数为UIEvent
的实例。但是您希望NSSet
的实例作为第一个参数,并向其发送anyObject
UIButton
无法理解的消息。这是崩溃的原因。
为什么您首先尝试将事件从UI控件发送到触控处理方法touchesMoved:withEvent:
?它可能与你的意思有所不同。
<强>更新强>
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent *)event {
UITouch *t = [touches anyObject];
CGPoint touchLocation = [t locationInView:self.view];
NSLog(@"%@", NSStringFromCGPoint(touchLocation));
}
- (IBAction)buttongDragged:(id)button withEvent:(UIEvent*)event {
NSSet *touches = [event touchesForView:button];
[self touchesMoved:touches withEvent:event];
}
请注意,由于touchesMoved:withEvent:
是UIResponder
的方法,而控制器的视图是 UIResponder
,因此此方法的触摸事件也会调用此方法。