0

我正在尝试优化我的应用程序中的代码。我有很多 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 上的按钮时,我得到一个僵尸对象,因为该对象已经被释放。然后我尝试在中声明KeyPadViewController *kpVC@interface尝试了一个自实例化方法,例如:

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

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

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

谢谢

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

4

1 回答 1

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.aeth.com/iOSBook/ch19.html#_container_view_controllers

于 2013-05-03T16:52:13.507 回答