Какао - обновить свойство в другом классе - PullRequest
0 голосов
/ 28 марта 2011

Я новичок в программировании для iPhone, и в Какао я не могу обновить свойство, которое я синтезировал в другом классе.

У меня есть два класса, которые должны работать вместе. В классе AnimalSelect пользователи нажимают кнопку. При нажатии кнопки пользователь перейдет в класс GamePlay, и на экране должно появиться имя выбранного им животного.

Я работаю с cocos2d для настройки игры. Я знаю, что делаю некоторые базовые вещи неправильно, но я не понял, что это такое.

Вот мой упрощенный код:

AnimalSelect.h

@class GamePlay;

@interface AnimalSelect : CCLayer {
    GamePlay *gamePlay;
}

AnimalSelect.m

#import "GamePlay.h"
....

NSString *dierenNaam = @"Test";
gamePlay = [[GamePlay alloc] init];
gamePlay.dierenNaam = dierenNaam;

GamePlay.h

@interface GamePlay : CCLayer {
    NSString *dierenNaam;
}

@property (nonatomic, retain) IBOutlet NSString *dierenNaam;

GamePlay.m

@synthesize dierenNaam;
....
NSLog(@"Dierennaam is: %@", dierenNaam);

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

@ edc1591 - Проблема в том, что мне нужны эти данные в классе GamePlay? Пользователь выбирает кнопку в представлении класса AnimalSelect и затем переносится в представление GamePlay. В этом представлении я хочу отобразить имя выбранного животного. Вот почему мне нужно обновить свойство "dierenNaam" в классе GamePlay.

EDIT Обновленный код:

titelLabel = [CCLabelTTF labelWithString: dierenNaam fontName: @ "Marker Felt" fontSize: 46]; titelLabel.position = ccp (160, 430); [self addChild: titelLabel];

Итак, я изменил код следующим образом:

GamePlay.h

@property (nonatomic, retain) CCLabelTTF *titelLabel;
@property (nonatomic, retain) NSString *dierenNaam;

- (void) updateLabel;

GamePlay.m

@synthesize titelLabel;
@synthesize dierenNaam;


- (void) updateLabel {
    [titelLabel setString:[NSString stringWithString:dierenNaam]];
}

AnimalSelect.m

gamePlay = [[GamePlay alloc] init];
gamePlay.dierenNaam = dierenNaam;
[gamePlay updateLabel];
[gamePlay release];

=== вернуться к основам ===

Вот новый код, который я попробовал, потому что я хотел вернуться к основам и обновить ярлык только с помощью xCode. Я создал розетки UILabel и соединил все в nib-файле. Вот код, который я использовал. Все методы NSLog выполняются, но метка не обновляется вместе с текстом переменной theUpdatedLabel.

AnimalTestViewController.h

#import <UIKit/UIKit.h>
@class Animal;
@interface AnimalTestViewController : UIViewController {

    UILabel *titelLabel;
    UIButton *firstButton;

}

@property (nonatomic, retain) IBOutlet UILabel *titelLabel;
@property (nonatomic, retain) IBOutlet UIButton *firstButton;

- (IBAction) firstButtonPressed;

@end

AnimalTestViewController.m

#import "AnimalTestViewController.h"
#import "Animal.h"

@implementation AnimalTestViewController
@synthesize titelLabel;
@synthesize firstButton;
@synthesize animal;

- (void) firstButtonPressed {
    NSLog(@"The first button was pressed");
    NSString *newAnimal = @"Horse";
    NSLog(@"The variable newAnimal has a value of: %@", newAnimal);

    NSString *labelText = [[NSString alloc] initWithFormat:@"Initial text: %@", newAnimal];
    titelLabel.text = labelText;
    [labelText release];

    Animal *theAnimal = [[[Animal alloc] init];
    theAnimal.animalName = newAnimal;
    [theAnimal release];
}

Animal.h #Импортировать @class AnimalTestViewController; @interface Animal: NSObject { NSString * animalName; }

@property (nonatomic, retain) NSString *animalName;
@property (nonatomic, retain) NSString *title;

- (void) updateLabel;

@end

Animal.m

#import "Animal.h"
#import "AnimalTestViewController.h"

@implementation Animal

@synthesize animalName;
@synthesize aViewController;

- (void) updateLabel {

    NSLog (@"The variable animalName has a value %@", animalName);
    NSString *theUpdatedLabel = @"The label is updated";
    AnimalTestViewController *aViewController = [[AnimalTestViewController alloc] init];
    aviewController.titelLabel.text = theUpdatedLabel;
}

1 Ответ

0 голосов
/ 28 марта 2011

NSLog должен находиться внутри функции, которая вызывается из класса AnimalSelect.Иначе ничего не будет зарегистрировано.

Попробуйте это:

AnimalSelect.h

@class GamePlay;

@interface AnimalSelect : CCLayer {
    GamePlay *gamePlay;
}

AnimalSelect.m

#import "GamePlay.h"
....

NSString *dierenNaam = @"Test";
gamePlay = [[GamePlay alloc] init];
gamePlay.dierenNaam = dierenNaam;
[gamePlay logDierenNaam];

GamePlay.h

@interface GamePlay : CCLayer {
    NSString *dierenNaam;
}

@property (nonatomic, retain) NSString *dierenNaam;
-(void)logDierenNaam;

GamePlay.m

@synthesize dierenNaam;

-(void)logDierenNaam {
     NSLog(@"Dierennaam is: %@", dierenNaam);
}

Если вы этого не сделаетеЕсли вы хотите иметь эту функцию logDierenNaam, вы можете написать свою собственную функцию setter и getter для dierenNaam (и удалить свойство, и синтезировать), и иметь setter, регистрирующее значение, но я не слишком знаком с этим.Я уверен, что вы можете найти руководство в Google.

...