2012-01-22 3 views
1

У меня есть пользовательский класс, и этот класс имеет переменную экземпляра UIButton. Я добавил этот код в классе назначенный инициализаторе:Программно создать UIButton - не будет вызывать действие?

theFishDeathView = [UIButton buttonWithType:UIButtonTypeCustom]; 
[theFishDeathView setFrame:CGRectMake(15, 15, 50, 50)]; 
[theFishDeathView setImage:[UIImage imageNamed:@"Small fish - death.png"] forState:UIControlStateNormal]; 

Так это должно правильно распределять/инициализировать кнопку. И действительно, кнопка get отображается на экране, когда это вызывается (и, конечно, добавляется как подвью).

Теперь я называю этот метод на моем объекте:

[theFishDeathView addTarget:self action:@selector(sellFish) forControlEvents:UIControlEventTouchDown]; 

А вот sellFish метод:

-(void) sellFish { 
    thePlayer.dollars += worthInDollars * 3; 
    [theFishDeathView removeFromSuperview]; 
} 

Но когда я пытаюсь нажать на кнопку, он не требует, что метод. Я что-то упустил?

Для полноты, вот файл Fish.h. Понятно, что theFishDeathView является экземпляром объекта Fish.

#import <Foundation/Foundation.h> 

@interface Fish : NSObject 
{ 
    float cookingTime; 
    float weight; 
    int worthInDollars; 
    NSString *name; 
    NSArray *animaionImages; 

    int fishMovementSpeed; 
} 

// Will be used to display 
@property (nonatomic, retain) UIImageView *theFishImageView; 
@property (nonatomic, retain) UIButton *theFishDeathView; 

// Create setter/getter methods 
@property (nonatomic, retain) NSString *name; 
@property (readonly) int worthInDollars; 
@property (readonly) int fishMovementSpeed; 

-(id) initWith: (NSString *)theName andWeight: (float)theWeight andCookingTime: (float)theCookingTime andValue: (int)theValue andMovementSpeed: (int)speed; 

-(CGRect) newFrameWithWidth:(int)width andHeight:(int)height; 

-(void) killFish; 

// Cooking methods 
-(void) startCooking; 
-(void) isDoneCooking; 
-(void) isOverCooked; 
-(void) sellFish; 

@end 
+0

Пожалуйста, включите метод sellFish, который вы пытаетесь вызвать. Это sellFish или sellFish:? – jrturton

+0

Я добавил метод sellFish, и он не принимает аргументов, так что это должно быть хорошо, так как sellFish – Seerex

+0

Обратите внимание: theFishDeathView - это UIButton, на который указывает объект Fish *, поэтому мне нужно изменить addTarget: self? я попытался изменить его на ноль, но это не решило его, поэтому мне было интересно, есть ли что-то еще, чтобы попробовать? – Seerex

ответ

0

Я хотел, чтобы люди знали я Fou (с некоторой помощью с форума разработчиков Apple) - это была утечка памяти. Я пытался отправить сообщение объекту зомби (то есть освобожденному объекту). Я думал, что это было сохранено, добавив его в качестве подвью, но я полностью забыл, что это BUTTON, который я добавил как subview, и НЕ класс, в котором была кнопка. Таким образом, сам класс освободился, и кнопка была сохранена, поэтому он все еще мог ее нажимать.

Для других, имеющих сходные проблемы, включите объекты Zombie Objects Enabled в файле plist.info. Таким образом вы получите сообщение об ошибке следующего вида: «Попытка отправить действие на освобожденный объект».

Спасибо за попытку помочь мне :)

0
[theFishDeathView addTarget:self 
       action:@selector(sellFish) 
     forControlEvents:UIControlEventTouchUpInside]; 

Вы писали UIControlEventTouchDownUIControlEventTouchDown не

+3

Да, я не уверен, что я понимаю, что там помощник? Я использовал UIControlEventTouchDown не UIControlEventTouchDown?: =) – Seerex

+0

UIControlEventTouchUpInside - стандартное событие для использования кнопок - пример кода в ответе в порядке, но объяснение неверно. – jrturton

+0

Спасибо, но это не решило:/ – Seerex

1

попробовать

-(void) sellFish:(id)sender 

и (с : после Sellfish)

[theFishDeathView addTarget:self 
       action:@selector(sellFish:) 
     forControlEvents:UIControlEventTouchUpInside]; 
+0

Спасибо, но это не решает это :(Я тоже попробовал сказать theFishDeathView.userInteractionEnabled = YES, но все равно ничего :( – Seerex

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