ViewController作为subView添加得太快发布了

时间:2013-05-03 10:39:14

标签: ios6 uiviewcontroller delegates addsubview

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

所以在KeyPadVC中,我设置的方法看起来像这样。

-(IBAction)keyPadKeyPressed:(id)sender
{
    [self.delegate interpretKeyPressed:[[sender titleLabel] text]];
}

在我的“父”ViewControllers中,我通过向我放置在Interface Builder中的普通UIView添加子视图来包括键盘(这样我有一个可视占位符)并连接到变量keypadView

-(void) viewDidLoad
{
    [super viewDidLoad];

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

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

-(KeyPadViewController *)kpVC
{
    if (!kpVC) {
        kpVC = [[KeyPadViewController alloc] init];
    }
    return kpVC;
}

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

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

由于

PS:这是伪代码缩短的时间 - 希望没有拼写错误 - 如果是这样的话那就不是问题了。 :)

1 个答案:

答案 0 :(得分:0)

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

保留视图控制器。

但是,您正在做的事情完全是非法的,因为您没有使用父子架构。请在此处查看我的回答:https://stackoverflow.com/a/15962125/341994

您可以在视图中添加子视图,但不得将视图控制器的视图作为子视图添加到视图中,而无需通过精心设计的父子架构。你不是那样做的。

我在这里解释了父子架构:

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