我正在尝试优化应用中的代码。我有很多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:这是伪代码缩短的时间 - 希望没有拼写错误 - 如果是这样的话那就不是问题了。 :)答案 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