2013-06-16 3 views
0

Мне нужна ваша помощь. Я пытаюсь построить игру. Когда кнопка нажата подсказка новый вид создается программно с помощью кода ниже:кнопка динамически созданного представления не отвечает

В моей gameController.m

//connect the Hint button 
-(void)setHud:(HUDView *)hud 
{ 
    _hud = hud; 
    [hud.btnHelp addTarget:self action:@selector(actionHint) forControlEvents:UIControlEventTouchUpInside]; 
} 

//the user pressed the hint button 
-(void)actionHint 
{ 
    CGRect viewRect = CGRectMake(kScreenWidth/2 -kMenuWidth, kScreenHeight/2-kMenuHeight,kMenuWidth*10, kMenuHeight*2); 
    HintMenu* hintMenu = [HintMenu viewWithRect:viewRect]; 
    [self.gameView addSubview:hintMenu]; 
} 

Это мой новый View создается программно.

+(instancetype)viewWithRect:(CGRect)r 
{ 
    HintMenu* hint = [[HintMenu alloc] initWithFrame:r]; 
    hint.userInteractionEnabled = YES; 

    UIImage* image=[UIImage imageNamed:@"btn"]; 

    hint.btnHelp = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [hint.btnHelp setTitle:@"button" forState:UIControlStateNormal]; 
    hint.btnHelp.titleLabel.font = kFontHUD; 
    [hint.btnHelp setBackgroundImage:image forState:UIControlStateNormal]; 
    hint.btnHelp.frame = CGRectMake(50, 30, image.size.width, image.size.height); 
    hint.btnHelp.alpha = 0.8; 
    [hint addSubview: hint.btnHelp]; 

    UIImage* image2=[UIImage imageNamed:@"tile"]; 
    hint.imageHelp=[[UIImageView alloc] initWithFrame:CGRectMake(image.size.width + 50 + 10, 30, image2.size.width, image2.size.height/2)]; 
    hint.imageHelp.image=image2; 
    [hint addSubview:hint.imageHelp]; 



    return hint; 
} 

Я хочу определить, когда нажата кнопка в новом представлении. Аналогично с вышесказанным я добавить в мой GameController.m

//connect the button in the Menu 
-(void)setHintMenu:(HintMenu *)hintMenu 
{ 
    _hintMenu = hintMenu; 
    [hintMenu.btnHelp addTarget:self action:@selector(actionHintMenu) forControlEvents:UIControlEventTouchUpInside]; 
} 

//the user pressed the menu button 
-(void)actionHintMenu 
{ 
    NSLog(@"Button in menu pressed"); 
} 

, но журнал не показано. Можете ли вы мне помочь?

редактировать: Если этот код добавляется в HintMenu.m, который мой новый Созданный вид, как это:

+(instancetype)viewWithRect:(CGRect)r 
{ 
... 
hint.btnHelp.alpha = 0.8; 
    [hint.btnHelp addTarget:self action:@selector(actionHintMenu:) forControlEvents:UIControlEventTouchUpInside]; 
    [hint addSubview: hint.btnHelp]; 
.. 
} 
//the user pressed the menu button 
-(void)actionHintMenu:(UIButton *) button 
{ 
    NSLog(@"Button in menu pressed"); 
} 

Я получаю эту ошибку:

2013-06-16 16:44:30.559 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[HintMenu actionHintMenu]: unrecognized selector sent to class 0xe6f8' 
*** First throw call stack: 

ответ

1

Ответ вам отредактированный вопрос

Заменить

[hint.btnHelp addTarget:self action:@selector(actionHintMenu) forControlEvents:UIControlEventTouchUpInside];

с

[hint.btnHelp addTarget:hint action:@selector(actionHintMenu) forControlEvents:UIControlEventTouchUpInside];

+0

Спасибо. Оно работает:) – ghostrider

1

Я не уверен, почему вы добавили [hintMenu.btnHelp addTarget:self action:@selector(actionHintMenu) forControlEvents:UIControlEventTouchUpInside]; внутри метода сеттера вашего hintMenu.

Нет вызова метода setter от hintMenu, и поэтому целевое действие кнопки не устанавливается.

Я предлагаю полностью удалить -(void)setHintMenu:(HintMenu *)hintMenu. Обновление actionHint

-(void)actionHint 
{ 
    CGRect viewRect = CGRectMake(kScreenWidth/2 -kMenuWidth, kScreenHeight/2-kMenuHeight,kMenuWidth*10, kMenuHeight*2); 
    HintMenu* hintMenu = [HintMenu viewWithRect:viewRect]; 
    [hintMenu.btnHelp addTarget:self action:@selector(actionHintMenu) forControlEvents:UIControlEventTouchUpInside]; 
    [self.gameView addSubview:hintMenu]; 
} 

Это просто исправить. Если вы спросите меня о правильном методе, я бы предложил установить, что цель кнопки должна быть сделана в вашем пользовательском представлении. Для этого вы можете сохранить свойство делегата в представлении.

+0

Да я добавил это в моем customView. Можете ли вы проверить мой обновленный ответ, пожалуйста? Я также проверю ваше решение. Благодаря! – ghostrider

+0

Я добавил еще один ответ – Adithya

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