ViewController 添加为子视图太​​快发布

Posted

技术标签:

【中文标题】ViewController 添加为子视图太​​快发布【英文标题】:ViewController added as a subView getting released too soon 【发布时间】:2013-05-03 10:39:13 【问题描述】:

我正在尝试优化我的应用程序中的代码。我有很多 ViewControllers 都使用一个通用的“键盘”。 我想将键盘提取到单独的 ViewController 中,然后将其包含到现有的 ViewController 中。 这样我就可以在单独的 ViewController 中消除重复的代码(处理来自键盘的反应所需要的)。

因此,在 KeyPadVC 中,我设置了如下所示的方法。

-(IBAction)keyPadKeyPressed:(id)sender

    [self.delegate interpretKeyPressed:[[sender titleLabel] text]];

在我的“父级”视图控制器中,我通过将子视图添加到放置在 Interface Builder 中的普通 UIView(以便我有一个可视占位符)并连接到变量 keypadView 来包含键盘。

-(void) viewDidLoad

    [super viewDidLoad];

    KeyPadViewController *kpVC = [[KeyPadViewController alloc] init];
    [kpVC setDelegate: self];
    [[self keypadView] addSubview:[kpVC view]];

这显示正常,但是当我按下 KeyPadViewController 上的按钮时,我得到一个僵尸对象,因为该对象已被释放。然后我尝试在@interface 中声明KeyPadViewController *kpVC 并尝试了一种自实例化方法,例如:

-(KeyPadViewController *)kpVC

    if (!kpVC) 
        kpVC = [[KeyPadViewController alloc] init];
    
    return kpVC;

我明明修改了viewDidLoad的方法,但是结果总是一样。对象过早释放。如果我添加 NSLogs,我可以看到来自 KeyPadVC 的 -(IBAction)keyPadKeyPressed 永远不会被调用,因为它 KeyPadVC 已经发布。

我做错了什么?我正在使用 ARC 和 ios6 SDK。

谢谢

PS:这是使事情更短的伪代码-希望没有拼写错误-如果是这样,那不是问题。 :)

【问题讨论】:

【参考方案1】:
KeyPadViewController *kpVC = [[KeyPadViewController alloc] init];
[kpVC setDelegate: self];
[[self keypadView] addSubview:[kpVC view]];
self.kpVC = kpVC;

保留视图控制器。

但是,您所做的事情是完全非法的,因为您没有使用父子架构。在这里查看我的答案:https://***.com/a/15962125/341994

您可以将子视图添加到您的视图中,但您不能将视图控制器的视图作为子视图添加到您的视图中,而无需经过精心设计的父子架构。而你并没有这样做。

我在这里解释一下父子架构:

http://www.apeth.com/iOSBook/ch19.html#_container_view_controllers

【讨论】:

以上是关于ViewController 添加为子视图太​​快发布的主要内容,如果未能解决你的问题,请参考以下文章

将viewController添加为子视图Swift不显示任何组件

当视图未将自身添加到其子视图时,“无法将自身添加为子视图”崩溃(带有示例代码)

在 iOS 中,将视图添加为子视图与将视图分配给视图属性之间有区别吗?

UICollectionView的选择性手势识别,UIView为子视图

从嵌入式子UIViewController中获取Parent ViewController

当从其父视图中删除第二个 ViewController 时,FirstViewController 不起作用