Objective-C:从class1 [alloc init]方式调用class 2实例是行不通的

时间:2011-10-28 09:08:51

标签: objective-c class init void alloc

我在GameScreen.m文件中有以下方法,在GameScreen.h文件中有自己的声明 - (void)drawNumbers:

//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类是事件处理程序,我得到所有按钮点击,计时器运行等等。我正在尝试从[viewDidLoad]调用[drawNumbers],因为我希望在屏幕显示时更改标题(屏幕管理是通过AppDelegate文件完成的)。

问题是,如果我通过

从同一个类中调用drawNumbers实例
//GameScreen.m

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

    [self drawNumbers];
}

它的工作原理(也就是说,代码实现或图形界面没有任何问题)。

我浏览了Apple Guide和互联网上的大量网页,但我似乎无法对此发现任何消息。非常感谢任何进一步的帮助(包括在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 :(得分:0)

由于你的cell00是由NIB设定的,如果你只是[[GameScreen alloc] init],它将是零。只有在加载了相应的NIB(并且实际建立了连接)时才会设置它。

如果可以在viewDidLoad中访问该单元格,请在GameScreen上创建一个属性并将其传递给该属性(或专用的initWithCell:或其他内容)。

如果IBOutlet GameScreen *aGameScreen;上有GameScreenViewController之类的内容(并且在同一个NIB中建立了与cell00的连接),则应该访问该内容。