在主UiViewController中动态声明子UiViewController

问题描述:

在我的程序中,我必须声明和使用多个子项UIViewController,就像我的主UIViewController中的自定义控件一样。但是当我点击一个孩子UIView控制器的按钮时,我得到一个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视图控制器的代码?

最后,我可以看到EricLars0n和user523234的建议后,解决我的问题。我很感激。这就是方式。

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

我用一个属性类型的NSMutableArray和我的程序创建的孩子UIViewControllers存入此NSMutableArray里。所以,我的孩子UiViewControllers没有办法停止,直到viewDidUnload。

谢谢你们!

在实施例1

subUiViewController *subViewController 

不复存在viewDidLoad中完成后。通常在iPhone应用程序中,每个屏幕都是它自己的视图控制器。如果你想加载一个新的屏幕/视图控制器,你可以像创建它一样创建它,或者以Modally形式显示它,或者如果你使用navigationController将它推入堆栈。

但是,如果你想要做的,你在做什么,你的主要的viewController需要类型的ID可以多抱你创建任何类型的viewController的一个属性。

取决于你在做什么新的能力在iOS 5中的视图控制器是其他视图控制器的容器视图控制器可能是有用的。具体地说,方法

addChildViewController: 

就像EricLarSOn解释。但是,在你的情况下,你可以做什么来声明通用属性的var,并动态地触发childviewcontroller类,并将其分配给通用变量,如前所述。 例如更换您

@财产(保留,非原子)subUiViewController * subViewController;

随着:

@property(保留,非原子)的UIViewController * myUIViewController;

然后

subUiViewController * subViewController = [[subUiViewController的alloc] initWithNibNameAndArtist:@ “subUiViewController” 束:无];

添加此行

self.myUIViewController = subViewController;

[subViewController release];

[self.view addSubView:self.myUIViewController。视图];

+0

谢谢你,但它仍然给我同样的错误。我的应用程序使用ARC。 – 2011-12-16 10:55:16