【发布时间】: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:这是使事情更短的伪代码-希望没有拼写错误-如果是这样,那不是问题。 :)
【问题讨论】:
标签: ios6 uiviewcontroller delegates addsubview