将控制器添加为从子视图打开的子控制器

问题描述:

我正在开发包含最新SDK的iOS 5.0+应用程序。将控制器添加为从子视图打开的子控制器

我有一个视图控制器的视图(VC1)。在这个视图里面我有一个自定义的孩子UIViewview2)。

从这个子视图我要打开另一个视图控制器(VC2),我想这样做增加VC2小时候控制器VC1,但我不知道该怎么做。

现在,视图2我有这样的方法:

- (void) handleLongClick:(UILongPressGestureRecognizer *)gestureRecognizer 
{ 
    SettingsDialogViewController* dialog = [[SettingsDialogViewController alloc] initWithNibName:@"GaugeSettingsDialogViewController" bundle:nil]; 

    dialog.view.frame = self.superview.superview.bounds; 
    [self.superview.superview addSubview:dialog.view]; 
} 

但如果我这样做,dialog将被释放,我不想添加一个实例变量,因为它会在内存中的所有时间。

如何添加VC2作为VC1的子控制器?

+0

我不明白你为什么不想创建父'UIViewController的实例变量/属性你能澄清一下吗? UIPopoverController做类似的事情,将子视图控制器存储在一个保留的属性中。 – 2013-04-10 07:01:20

+0

因为它会一直在内存中,浪费内存。 – VansFannel 2013-04-10 07:36:25

但如果我这样做,对话框将被释放,我不想添加一个实例变量,因为它每次都将在内存中。

即使您不这样做,它也会在内存中的保留数少一个。但是你不需要把它作为一个成员变量来显示。

从视图切换到另一视图有很多方法。我看到你有两个视图控制器。所以我会告诉你最简单(常见)的方法。

  • 推到navigationstack

如果您认为有一个导航控制器,你可以在第二控制器推送到导航堆栈。虽然显示VC1

UINavigationController *navigationller = [[UINavigationController alloc] initWithRootViewController:VC1]; 
// show VC1 

然后显示VC2这样

- (void) handleLongClick:(UILongPressGestureRecognizer *)gestureRecognizer 
{ 
SettingsDialogViewController* dialog = [[SettingsDialogViewController alloc] initWithNibName:@"GaugeSettingsDialogViewController" bundle:nil]; 

[self.navigationController pushViewController:dialog animated:YES]; 
} 

您会自动获取导航栏上的后退按钮。

  • 显示为模态

对于你不需要有导航控制器。

- (void) handleLongClick:(UILongPressGestureRecognizer *)gestureRecognizer 
{ 
SettingsDialogViewController* dialog = [[SettingsDialogViewController alloc] initWithNibName:@"GaugeSettingsDialogViewController" bundle:nil]; 

[self presentViewController:dialog animated:YES completion:nil]; 
} 

当然,你需要添加一个动作再次关闭它,如果你想要的。在导航控制器上,您将自动获得导航栏上的后退按钮。请尝试两者并决定你需要什么。

+0

感谢您的回答,但我不能'[self presentViewController:dialog animated:YES completion:nil];'因为' - (void)handleLongClick:(UILongPressGestureRecognizer *)gestureRecognizer'在UIView上。 – VansFannel 2013-04-10 07:37:28

+1

然后你的观点必须告诉他的视图控制器他认识到了这个动作(例如使用委托)。视图控制器应该负责改变视图而不是视图。一个观点不应该那样做,它是针对MVC模式的。 – Mert 2013-04-10 07:41:28