2013-05-13 6 views
0

Я добавлю, чтобы поместить салфетки вверх к изображению, но при проверке, судороги приложения с ошибкой BAD_EXEC.UIGestureRecognizer Crash

Это то, что у меня есть:

.h файл:

@interface MyViewController : UIViewController <UIGestureRecognizerDelegate> 
{ 

    UISwipeGestureRecognizer* swipeUpGesture; 
    IBOutlet UIImageView* myImage; //Connected from Interface Builder 
    IBOutlet UIScrollView* myScrollView; 
} 

@property (retain, nonatomic) UISwipeGestureRecognizer* swipeUpGesture; 
@property (retain, nonatomic) IBOutlet UIImageView* myImage; 
@property (retain, nonatomic) IBOutlet UIScrollView* myScrollView; 

.m файл:

- (void)viewDidLoad 
{ 

    //myImage is inside of myScrollView 

    swipeUpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped)]; 
    [swipeUpGesture setDirection:UISwipeGestureRecognizerDirectionUp]; 
    [swipeUpGesture setDelegate:self]; 
    [myImage addGestureRecognizer: swipeUpGesture]; 

} 


- (void)swiped:(UISwipeGestureRecognizer*)sentGesture 
{ 
    NSLog (@"swiped"); 
} 

Так в основном, в пределах myView, у меня есть myScrollView. Внутри myScrollView у меня есть myImage.

Когда я запускаю над кодом, приложение запускается до тех пор, пока я не прокручу вверх, тогда он фактически распознает салфетки, но не доходит до NSLog, сбой и я получаю BAD_EXEC.

Заранее спасибо.

+1

Можете ли вы добавить всю ошибку? –

ответ

2

У вас есть несоответствие подписи.

 
swipeUpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped)]; 

Ваш селектор «прокатывается», без двоеточия, что означает цель времени выполнения, будет пытаться найти метод, который принимает параметр «нулевой».

И поскольку ваш «swiped» принимает параметр, среда выполнения не сможет найти совпадение при попытке вызвать метод и поэтому сработает.

-

Изменение @selector (наотмашь) к @selector (спер :) и он должен работать.

1

Вы забыли двоеточие:

swipeUpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped)]; 

должен быть

swipeUpGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped:)]; 

без двоеточия, среда выполнения Obj-C будет пытаться найти метод без каких-либо аргументов.

+0

После их исправления я все равно получаю такой же крах. "EXC_BAD_ACCESS (код = 2, адрес = 0x8)" http://img607.imageshack.us/img607/4936/screenshot20130514at105.png – Gizmodo

0

(Как сказал @Undo, вы забыли двоеточие.)

Однако, вы все равно можете получить ошибку EXC_BAD_ACCESS, если ваш ViewController был выпущен до возникновения события касания.

Это может произойти при добавлении представления ViewController в качестве подчиненного объекта в другой контроллер представления. например

[mainViewController.view addSubview:self.view] 

Где находится ваш MyViewController. Вы можете проверить это, добавив точку останова в

-(void)dealloc 

метод вашего MyViewController. И проверьте, отменен ли MyViewController до вашего события касания.

Вы можете исправить это, добавив ссылку на MyViewController (ARC), где бы вы ни создавали экземпляр.

3

Если вы используете addSubview, выполните следующие действия:

[self addChildViewController:myViewController]; 

После этого:

[self.view addSubView: myViewController.view]; 

Затем используйте UISwipeGestureRecognizer в контроллере представления.

Смежные вопросы