2011-12-16 8 views
1

私のプログラムでは、UIViewControllerのカスタムコントロールのように複数の子を宣言して使用する必要があります。UIViewControllerしかし、子のUIViewコントローラの1つのボタンをクリックすると、EXC_BAD_ACCESSエラーが発生します。以下の私のサンプルコード構造を見てください。メインUiViewControllerの子UiViewControllerを動的に宣言する

例1:

//--Child------------------------------------------------------------------- 
@interface subUIViewController<UIViewController> 

    -(IBAction)myButtonClick:(id)Sender; 

[email protected] subUiViewController 

    -(IBAction)myButtonClick:(id)Sender 
    { 
      NSLog(@"Button Click Event....."); 
    } 

//---Main-------------------------------------------------------------------- 

@interface mainUIViewController<UIViewController> 

@implementation mainUIViewController 

    -(void)viewDidLoad 
    { 
      [super viewDidLoad]; 
      subUiViewController *subViewController=[[subUiViewController alloc] initWithNibNameAndArtist:@"subUiViewController" bundle:nil]; 
      [self.view addSubView: subViewController.view]; 
    } 

//--------------------------------------------------------------------------- 
//--------------------------------------------------------------------------- 

しかし、私はMainViewController@property (retain,nonatomic) subUiViewController *subViewControllerと宣言した場合、それはエラーなしで働いています。次のコードを参照してください。

例2:

//---Child------------------------------------------------------------------ 
@interface subUIViewController<UIViewController> 

    -(IBAction)myButtonClick:(id)Sender; 

@implementation subUiViewController 

    -(IBAction)myButtonClick:(id)Sender 
    { 
      NSLog(@"Button Click Event....."); 
    } 

//----Main----------------------------------------------------------------- 


@interface mainUIViewController<UIViewController> 
    @property(retain,nonatomic) subUiViewController *subViewController; 

@implementation mainUIViewController 
    @synthesize subViewController; 

    -(void)viewDidLoad 
    { 
      [super viewDidLoad]; 
      subViewController=[[subUiViewController alloc] initWithNibNameAndArtist:@"subUiViewController" bundle:nil]; 
      [self.view addSubView: subViewController.view]; 
    } 


//--------------------------------------------------------------------------- 
//--------------------------------------------------------------------------- 

例1が動作していないと実施例2が動作している理由を私は知りません。私は、例1を使用する必要があります。なぜなら、Core Data Returnに基づいて子uiビューコントローラをプログラムで作成する必要があるからです。何が間違っているのかを教えてください。どのようにコード内で子uiビューコントローラを動的に宣言できますか?例で

答えて

1

最後に、私はEricLars0nとuser523234の提案を見てから問題を解決することができます。それは有り難いです。ここに方法があります。私は1つのプロパティタイプNSMutableArrayのを使用して、このNSMutableArrayのに私のプログラムで作成された子UIViewControllersを保存

@interface mainUIViewController<UIViewController> 
    @property(retain,nonatomic) NSMutableArray *myViewControllers; 

@implementation mainUIViewController 
    @synthesize myViewControllers; 

    -(void)viewDidLoad 
    { 
      [super viewDidLoad]; 

      //Sub View Controller 1 
      subUiViewController *subViewController1=[[subUiViewController alloc] initWithNibName:@"subUiViewController" bundle:nil]; 
      [self.myViewControllers addObject:subViewController1]; 
      [self.view addSubView: subViewController1.view]; 

      //Sub View Controller 2 
      subUiViewController *subViewController2=[[subUiViewController alloc] initWithNibName:@"subUiViewController" bundle:nil]; 
      [self.myViewControllers addObject:subViewController2]; 
      [self.view addSubView: subViewController2.view]; 
    } 

。だから、私の子供UiViewControllers viewDidUnloadまで終了する方法はありません。

ありがとうございました!

1
subUiViewController *subViewController 

でのviewDidLoadが終了した後に消滅します。通常iPhoneアプリでは、各画面は独自のView Controllerです。また、新しいscreen/viewControllerをロードしたい場合は、そうしたように作成し、それをModalで表示するか、またはnavigationControllerを使用してスタック上にプッシュします。

あなたがしていることをしたいのであれば、メインのviewControllerには、作成したviewControllerのタイプを保持できるtype idのプロパティが必要です。

あなたが行っていることに応じて、View Controllerが他のView Controller用のコンテナビューコントローラになるためのiOS 5の新しい機能が役立つかもしれません。具体的には、方法は

addChildViewController: 
0

EricLarSOnと同じです。しかし、あなたの状況では、プロパティを持つジェネリックvarを宣言し、childviewcontrollerクラスを動的にインストラクションし、それを前述のようにジェネリックvarに割り当てるために何を行うことができますか? たとえば、次のように置き換えます。

@property(保持、非構造)subUiViewController * subViewController;

で:(非アトミック保持)

@propertyのUIViewController * myUIViewController。

そして

subUiViewController * subViewController = [[subUiViewControllerのalloc] initWithNibNameAndArtist: "subUiViewController" バンドル@:nilを];

self.myUIViewController = subViewControllerこの行を追加します。

[subViewController release];

[self.view addSubView:self.myUIViewController。ビュー];

+0

ありがとうございます。でも、それでも私は同じエラーが出ます。私のアプリケーションはARCを使用しています。 –

+1

ARCを使用する場合は、この行を削除してください [subViewController release]; – user523234

関連する問題