在主 UiViewController 中动态声明子 UiViewController

Posted

技术标签:

【中文标题】在主 UiViewController 中动态声明子 UiViewController【英文标题】:Dynamically declare child UiViewController in main UiViewController 【发布时间】:2011-12-16 01:36:28 【问题描述】:

在我的程序中,我必须声明和使用多个子 UIViewController,就像我的主 UIViewController 中的自定义控件一样。但是,当我单击其中一个子 UIView 控制器的按钮时,我得到一个 EXC_BAD_ACCESS 错误。请看下面我的示例代码结构。

示例 1:

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

     -(IBAction)myButtonClick:(id)Sender;

-@implementation 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 的建议后,我终于可以解决我的问题了。我很感激。这是方法。

@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。

谢谢大家!

【讨论】:

【参考方案2】:

在示例 1 中

subUiViewController *subViewController

viewDidLoad 完成后不再存在。通常在 iPhone 应用程序中,每个屏幕都是它自己的视图控制器。如果你想加载一个新的屏幕/视图控制器,你可以像以前一样创建它,或者以模态方式显示它,或者如果你使用的是导航控制器,则将其推送到堆栈上。

但是如果你想做你正在做的事情,你的主 viewController 需要一个 id 类型的属性,它可以保存你创建的任何类型的 viewController。

根据您在 ios 5 中所做的新功能,让 View Controller 成为其他 View Controller 的容器 View Controller 可能会很有用。具体方法

addChildViewController:

【讨论】:

【参考方案3】:

正如 EricLarSON 解释的那样。但是,在您的情况下,您可以做什么来声明具有属性的泛型 var 并动态实例化 childviewcontroller 类并将其分配给泛型 var,如前所述。 例如替换你的

   @property(retain,nonatomic) subUiViewController *subViewController;

与:

       @property(retain,nonatomic) UIViewController *myUIViewController;

然后

       subUiViewController *subViewController=[[subUiViewController alloc] initWithNibNameAndArtist:@"subUiViewController" bundle:nil];

添加这一行

self.myUIViewController = subViewController;

[subViewController 发布];

[self.view addSubView: self.myUIViewController.view];

【讨论】:

谢谢家伙,但它仍然给我同样的错误。我的应用程序使用 ARC。 如果你使用ARC,去掉这行[subViewController release];

以上是关于在主 UiViewController 中动态声明子 UiViewController的主要内容,如果未能解决你的问题,请参考以下文章

声明一个动态大小的数组

appDelegate 可以使用在 UIviewController 上声明的函数吗

在 Swift 中动态创建 uiviewcontroller

检测打开 uiviewcontroller 的父母

如何在我的 UIViewController 类中声明 UIImageView 以便其他类可以使用它?

UIViewController 中动态大小的表格视图