UIButton падает на событие uitouch - PullRequest
0 голосов
/ 10 марта 2011

У меня есть 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];
}

1 Ответ

4 голосов
/ 10 марта 2011

Когда вы добавляете цель для управления, вы можете передать 3 типа селекторов для действия -

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

Имена не имеют значения, важен номер параметра. Если элемент управления отправляет своей цели сообщение с 2 параметрами, тогда первым параметром будет сам элемент управления (экземпляр UIButton в вашем случае), вторым - экземпляр UIEvent. Но вы ожидаете экземпляр NSSet в качестве первого параметра и отправляете ему сообщение anyObject, которое UIButton не понимает. Это причина аварии.

Почему вы пытаетесь отправить событие из управления пользовательским интерфейсом в метод обработки касания touchesMoved:withEvent: в первую очередь? Это, вероятно, сделает что-то отличное от того, что вы имели в виду.

UPDATE

- (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, этот метод также будет вызываться для событий касания для этого представления.

...