Objective-C:class1 [alloc init] wayからクラス2インスタンスを呼び出すことができません

GameScreen.mファイルで、GameScreen.hファイルに独自の宣言 - (void)drawNumbersを持つ以下のメソッドがあります:

//GameScreen.h
#import 

@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];
}

これは、GameScreenViewController.mがviewControllerのGameScreen.xibファイル内のボタンのタイトルを変更するはずです。GameScreenクラスは、すべてのボタンのクリック、タイマーの実行などを取得するイベントハンドラです。[drawNumbers ]を[viewDidLoad]から削除する必要があります(スクリーン管理はAppDelegateファイルを介して行われます)。

問題は、同じクラスの内部からdrawNumbersインスタンスを呼び出すと

//GameScreen.m

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

    [self drawNumbers];
}

それは動作します(つまり、コード実装やグラフィックインターフェイスに何も問題はありません)。

私はApple Guideとインターネット上の多数のページを閲覧してきましたが、これについては何の光も見つけられません。それ以上の援助(ADGの答えがどこに正確にあるかについての回答を含む)は本当に感謝します。

(編集:ここではAppDelegateのコードを使って、特定のビューを表示する)

//myAppAppDelegate.h
#import 
@class myAppViewController, GameScreenViewController;
@interface myAppDelegate : NSObject 
{
    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]];
}
0
GameScreen.hの内容を投稿できますか?
追加された 著者 Suhail Patel,
GamesViewController.m viewDidLoadメソッドでこの行を変更します[GameScreen release]; [aGameScreen release]に移動します。
追加された 著者 denil,
GameScreencell00 インスタンス変数はどのように設定されていますか?これはここには表示されていませんが、 -drawNumbers メソッドを呼び出すときに nil することができます。
追加された 著者 user23743,
要求に応じて編集されます。そこにはセルインスタンス変数も表示されます。
追加された 著者 Mario,
ここにミス、私の悪い。説明が編集されました。 AppDelegateファイルも必要ですか?
追加された 著者 Mario,

1 答え

[[GameScreen alloc] init] を実行するだけで、 cell00 はNIBによって設定されるため、nilになります。これは、対応するNIBがロードされている(そして接続が実際に設定されている)場合にのみ設定されます。

viewDidLoad でセルにアクセスできる場合は、 GameScreen にプロパティを作成し、プロパティ(または専用の initWithCell:など)に渡します。 )。

あなたが GameScreenViewControllerIBOutlet GameScreen * aGameScreen; のようなものを持っていて(同じNIBの cell00 への接続も確立している)その代わりにアクセスしてください。

0
追加された
NIB/XIBは逆シリアル化されています。つまり、その中のすべてのオブジェクトが( NSCoder で)デコードされ、関連付け/接続は読み込み中になります。完了したら viewDidLoad に到達します。あなたが作成したオブジェクトはすべて、NIB/XIBと関係がありません。 [[GameScreen alloc] init] を実行すると、そのインスタンスの IBOutlet は接続されません。 Nibファイルセクションのリソースプログラミングガイドを参照してください。
追加された 著者 DarkDust,
私はそれを得ない。 viewControllerがFileの所有者とGameScreenに関連しているため、 - (void)fliptoScreenXでビューが追加された場合、xibが表示されたときにviewControllerとクラスの両方がロードされないようにします。景色?
追加された 著者 Mario,
「小さな」回避策:ViewControllerクラスにIBOutletsを、GameScreenクラスにIBActionsを設定していればうまくいくでしょうか?私は20以上のボタンを持っています。つまり、すべての変数を倍にすることです。良いことではありません...(それは「きれいでシンプルな」視点から)OKですか?
追加された 著者 Mario,
ヒントをありがとう、私は本当にそれを感謝します。その間、私は自分のコードを少し歪ませることに決めました.AppDelegateはビューマネージャとして働き、ViewControllerは出力として動作し、クラスは入力として動作します。そうすれば、私はMVCモデルに固執しても、きれいなコードを残すことができます...本当にありがとうございます。
追加された 著者 Mario,