Objective-C: вызов экземпляра класса 2 из пути class1 [alloc init] не работает - PullRequest
0 голосов
/ 28 октября 2011

У меня есть следующий метод в файле GameScreen.m с его собственным объявлением - (void) drawNumbers в файле GameScreen.h:

//GameScreen.h
#import <UIKit/UIKit.h>

@interface GameScreen : UIView
{
  IBOutlet UIButton *cell00;
}
- (void) drawNumbers;
- (IBAction) onCellClick:(id)sender;
@property (nonatomic, retain) IBOutlet UIButton *cell00;

@end



//GameScreen.m

#import "GameScreen.h"
- (void) drawNumbers
{
   //testing if this works, so far it doesn't
   [cell00 setTitle:@"Whatever" forState:UIControlStateNormal];
   [cell00 setTitle:@"Whatever" forState:UIControlStateHighlighted];
}

Я пытаюсь вызвать этот методиз моего файла GameScreenViewController.m, таким образом:

//GameScreenViewController.m

#import "GameScreenViewController.h"
#import "GameScreen.h"
... 
- (void) viewDidLoad
{
   GameScreen *aGameScreen = [[GameScreen alloc] init];
   [aGameScreen drawNumbers];
   [aGameScreen release];

   [super viewDidLoad];
}

Это должно изменить название кнопки в файле GameScreen.xib, где GameScreenViewController.m - это viewController, а класс GameScreen - обработчик событий, гдеЯ получаю все нажатия кнопок, таймеры и т. Д. Я пытаюсь вызвать [drawNumbers] из [viewDidLoad], так как я хочу, чтобы заголовок изменялся, когда экран выводится на передний план (управление экраном осуществляется через файлы AppDelegate).

Дело в том, что если я вызываю экземпляр drawNumbers из того же класса через

//GameScreen.m

#import GameScreen.h
-(void) onButtonClick:(id)sender
{
    //some other code

    [self drawNumbers];
}

, это работает (так сказать, ничего плохого в реализации кода или графическом интерфейсе).

Я просмотрел руководство Apple и тонны страниц в Интернете, но, похоже, не могу найти в этом ничего хорошего.Любая дальнейшая помощь (включая ответы о том, где именно найти ответ в ADG) будет очень признательна.

(Отредактировано: здесь идет код AppDelegate, чтобы перейти на конкретный вид, на всякий случай):

//myAppAppDelegate.h
#import <UIKit/UIKit.h>
@class myAppViewController, GameScreenViewController;
@interface myAppDelegate : NSObject <UIApplicationDelegate>
{
    UIWindow *window;
    myAppViewController *viewController;
    GameScreenViewController *gameScreenViewController;
}

- (void) flipToGameScreen;

@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) GameScreenViewController *gameScreenViewController;
@end

//myAppAppDelegate.m
-(void) flipToGameScreen
{
    GameScreenViewController *aGameScreenView = [[GameScreenViewController alloc] initWithNibName: @"GameScreen" bundle:nil];
    [self setGameScreenViewController:aGameScreenView];
    [aGameScreenView release];
    [gameScreenViewController.view.frame = [[UIScreen mainScreen] applicationFrame];
    [viewController.view removeFromSuperview];
    [self.window addSubview:[gameScreenViewController view]];
}

1 Ответ

0 голосов
/ 28 октября 2011

Поскольку ваш cell00 должен быть установлен NIB, он будет равен нулю, если вы просто сделаете [[GameScreen alloc] init]. Он будет установлен только в том случае, если загружен соответствующий NIB (и соединение фактически установлено).

Если ячейка доступна в вашем viewDidLoad, создайте свойство на GameScreen и передайте его через свойство (или выделенный initWithCell: или что-то еще).

Если у вас есть что-то вроде IBOutlet GameScreen *aGameScreen; на вашем GameScreenViewController (и также установлено соединение с cell00 в том же NIB), вы должны получить к нему доступ.

...