在主 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