Как сложить значение при нажатии кнопки

В прошлый раз я спросил, как сложить значение при нажатии кнопки в методе

-(IBAction)addTap:(id)sender;

теперь меня научили использовать tapCount++; (tapCount - это переменная типа int) для добавления 1 при каждом нажатии кнопки.

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

Я хочу сделать значение tapCount равным 1, если я нажму кнопку один раз, и сделать его равным 2, если я нажму кнопку дважды, и так далее.

Может кто подскажет, как это сделать?

Деталь:

Допустим, у меня есть класс Player, член с именем int tapCount и int result

при каждом нажатии кнопки значение будет добавлено к tapCount, и значение будет отображаться в конце (когда, скажем, конец игры)

На данный момент значение остается прежним, когда я использую NSLog для его проверки.

Player.h

@class TappingViewController;

@interface Player : NSObject {

    NSString *name;
    int tapCount;
    int result;

}

@property (nonatomic, assign) NSString *name;
@property (nonatomic, assign) int tapCount;
@property (nonatomic, assign) int result;

@end

TappingViewController.h

@interface TappingViewController : UIViewController {

}

-(IBAction)addTap:(id)sender;

@end

TappIngViewController.m

 #import "TappingViewController.h"
  #import "Player.h"

@class Player;

int tapCount;

@implementation TappingViewController


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    }
    return self;
}

/*
- (void)loadView {
}
*/

- (void)viewDidLoad 

{

    Player *aPlayer = [[Player alloc]init];

    NSLog(@"tapCount:%d", aPlayer.tapCount);



    [super viewDidLoad];
}

-(IBAction)addTap:(id)sender;
{


    NSLog(@"BeforeL %d", tapCount);
   tapCount++;
    NSLog(@"After: %d", tapCount);



}
/*
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
}


- (void)dealloc {
    [super dealloc];
}

@end

person mikemike    schedule 27.03.2011    source источник
comment
не могли бы вы прояснить это. Если я прав, вы хотите подсчитывать количество нажатий на кнопку каждый раз, когда вы ее нажимаете, но это зависит от того, сколько времени вы хотите рассчитать.   -  person saadnib    schedule 27.03.2011
comment
что вы имеете в виду под ценностью осталась прежней? вы пытаетесь обновить что-то на экране? как вы определяете, что он остается прежним?   -  person Mat    schedule 27.03.2011
comment
Можете ли вы опубликовать точный код, который у вас есть? И ваш класс игрока, и класс, содержащий метод addTap:? В вашем addTap: методе есть только tapCount++ или что-то вроде player.tapCount++?   -  person Jonathan.    schedule 27.03.2011
comment
А реализация addTap:?   -  person Jonathan.    schedule 27.03.2011
comment
Есть ли у TappingViewController объект Player?   -  person Erik B    schedule 27.03.2011
comment
RE: Эрик Б. - Нет, просто декларация IBAction. также обновили реализацию для addTap, реализация для Player.h включает только @synthesize Извини, что пропустил многое с самого начала, я очень благодарен твоему пациенту :(   -  person mikemike    schedule 27.03.2011
comment
@mikemike здесь, чтобы помочь :) Надеюсь, мой ответ будет, если у вас есть еще вопросы по поводу ответа, просто прокомментируйте его.   -  person Jonathan.    schedule 27.03.2011


Ответы (3)


В методе addTap: вы ссылаетесь на tapCount Контроллера TappingViewController, который отличается от tapCount проигрывателя, хотя у них одно и то же имя, они разные. Итак, вам нужно сослаться на свойство aPlayer tapCount:

aPlayer.tapCount++;

Однако aPlayer не входит в сферу применения addTap: метода. Единственное место, где вы можете сейчас ссылаться на aPlayer, - это метод viewDidLoad.

Вот что вам нужно изменить: (вам не нужны комментарии, которые я добавил, чтобы указать на изменения)

TappingViewController.h

@class Player; //**You have imported the Player class in the .m file so if you use the Player class in the header you need to add it as a forward class.
@interface TappingViewController : UIViewController {
    Player *aPlayer; //**This is an instance variable (ivar) so you can access it in any method in the implementation (.m file), however you still need to put something in this ivar (see viewDidLoad)**
}
//**You can add a property for aPlayer if you want, but remember to do the memory management properly**    
-(IBAction)addTap:(id)sender;

@end

TappIngViewController.m

#import "TappingViewController.h"
#import "Player.h"

//**Get rid of the forward class, as you have imported it above**

//**Get rid of the tapCount that was were**

@implementation TappingViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    }
    return self;
}

/*
- (void)loadView {
}
*/

- (void)viewDidLoad 

{

    aPlayer = [[Player alloc] init]; //**remove the declaration of a new var**

    NSLog(@"tapCount:%d", aPlayer.tapCount);

    [super viewDidLoad];
}

-(IBAction)addTap:(id)sender;
{

    NSLog(@"BeforeL %d", tapCount);
   aPlayer.tapCount++; //**reference the player's tapCount**
    NSLog(@"After: %d", tapCount);



}
/*
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
}


- (void)dealloc {
    [super dealloc];
}

@end
person Jonathan.    schedule 27.03.2011
comment
Спасибо, Джонатан. Я знаю, что всякий раз, когда я использую методы получения и установки, я должен их выпустить. В этом случае, поскольку я импортирую класс Player в ViewController, следует ли мне выпустить его в файле .m Player или файле .m ViewController? - person mikemike; 27.03.2011
comment
@mikemike, вы должны выпустить его в том же файле, в котором вы его предоставили. Итак, здесь вы должны освободить Player в контроллере просмотра. - person Jonathan.; 27.03.2011

Мне действительно не кажется, что вы предоставляете достаточно информации, чтобы мы могли сказать вам, что идет не так. При этом я мог бы указать вам в правильном направлении.

Прежде всего, я бы посоветовал вам попробовать следующий код:

-(IBAction)addTap:(id)sender {
    NSLog(@"Before: %d", tapCount);
    tapCount++;
    NSLog(@"After: %d", tapCount);
}

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

Если вы получите следующий результат:

Before: 0
After: 1
Before: 0
After: 1
Before: 0
After: 1

Это означает, что вы устанавливаете tapCount = 0; снова и снова.

Если вы не получаете никакого вывода, это означает, что ваш IBAction не подключен должным образом.

Если вы получите ожидаемый результат, но это то же самое, когда вы "NSLog to check it". Это означает, что вы случайно снова запустили tapCount = 0;.

Другая возможность - что-то не так с вашим NSLog.

Если у вас есть вопросы, не стесняйтесь спросить.

person Erik B    schedule 27.03.2011
comment
Привет, я добавил два NsLog, как и вы, и вот что именно со мной происходит, кстати, моя переменная tapCount находится в другом файле класса, это тоже проблема? - person mikemike; 27.03.2011
comment
@mikemike В вашем примере кода не указано, что tapCount находится в другом классе. Как называется этот класс? - person Black Frog; 27.03.2011
comment
@mikemike Не могли бы вы опубликовать весь код, связанный с tapCount, чтобы мы могли сказать вам, в чем проблема? - person Erik B; 27.03.2011

Я предполагаю, что IBAction находится в вашем контроллере. Вам нужно будет добавить переменную в свой заголовок. В контроллере например:

Учитывая, что у вас есть счетчик нажатий в другом классе, вашему контроллеру нужен указатель на этот класс.

// controller header file
Player *myPlayer;

// controller implementation file
-(void)awakeFromNib {
    myPlayer = [Player alloc] init];  // initialized the player
    // do whatever else you need to do
    // load previous data from NSUserDefaults, maybe
}

-(IBAction)addTap:(id)sender {
    myPlayer.tapCount++;
}
person Black Frog    schedule 27.03.2011
comment
Да, у меня есть один файл класса под названием Player, я объявляю свой tapCount в этом файле. а затем я импортирую этот файл в свой файл реализации контроллера и вызываю метод IBAction, чтобы установить значение tapCount, проблема в том, что они разделены? - person mikemike; 27.03.2011