Программно создать UIButton - не вызовет ли действие? - PullRequest
1 голос
/ 22 января 2012

У меня есть собственный класс, и у этого класса есть 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

Ответы [ 3 ]

1 голос
/ 22 января 2012

1001 * попробовать *

 -(void) sellFish:(id)sender

и (с : после sellFish)

[theFishDeathView addTarget:self
                 action:@selector(sellFish:)
       forControlEvents:UIControlEventTouchUpInside];
0 голосов
/ 25 января 2012

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

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

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

0 голосов
/ 22 января 2012
  [theFishDeathView addTarget:self
                 action:@selector(sellFish)
       forControlEvents:UIControlEventTouchUpInside];

вы написали UIControlEventTouchDown не UIControlEventTouchDown

...