子类视图控制器收到错误“不符合键值编码”
Posted
技术标签:
【中文标题】子类视图控制器收到错误“不符合键值编码”【英文标题】:Sub-classed View Controller gets error 'not key value coding-compliant' 【发布时间】:2010-09-12 11:39:11 【问题描述】:我已经连续 2 天尝试解决这个错误,但似乎找不到问题。
我像这样对标准 ViewController 进行了子类化:
@interface ToolbarVC : UIViewController
IBOutlet UIButton* button1;
IBOutlet UIButton* button2;
IBOutlet UIButton* button3;
IBOutlet UIButton* button4;
@property(nonatomic, retain) IBOutlet UIButton* button1;
@property(nonatomic, retain) IBOutlet UIButton* button2;
@property(nonatomic, retain) IBOutlet UIButton* button3;
@property(nonatomic, retain) IBOutlet UIButton* button4;
-(IBAction) button1Pressed:(id)sender;
-(IBAction) button2Pressed:(id)sender;
-(IBAction) button3Pressed:(id)sender;
-(IBAction) button4Pressed:(id)sender;
@end
在界面生成器中,我像往常一样将所有按钮连接到文件的所有者。
在 ToolbarVC Identity 检查器中,在类标识下,我将 File's Owner 类名更改为“ToolbarVC”。
在我的 AppViewController 中,我像这样实例化类:
ToolbarVC* tbvc = [[ToolbarVC alloc] init];
photoToolbarVC = tbvc; // this is my class variable
[self.view addSubview:tbvc.view];
ToolbarVC 初始化,并在它的 viewDidLoad 方法中正确设置按钮名称和大小。
但是,如果我尝试单击按钮,它会因“EXC_BAD_ACCESS”而崩溃。如果我尝试像这样将工具栏动画化到视图中:
[UIView beginAnimations:@"addToolbars" context:nil];
[UIView setAnimationDuration:kFadeDuration];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[photoToolbarVC.view setCenter:CGPointMake(512, 200)];
[UIView commitAnimations];
它给了我这个错误:
*** 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:该类不符合键 button4 的键值编码。”
我搜索了两天,尝试了几种方法来修复它,包括 initWithNibName:@"ToolbarVC"。
有趣的是,如果我不将它动画化到视图中,它会显示,并且按钮的名称和大小都正确(这发生在 ToolbarVC viewDidLoad 方法中,当它创建时)。只有当我尝试对其进行动画处理或单击按钮时,它才会崩溃。
【问题讨论】:
只是出于兴趣,为什么需要四种方法(每个按钮一个)。当然,当您收到sender
时,您可能只需要一个识别哪个按钮被按下的按钮?另外,您能否发布 ToolbarVC.m 和 AppViewController.m 的所有代码?
我会发布所有代码,但它很广泛,并且不想让所有不相关的代码填满问题。就按钮而言,我可以这样做,但是它们的名称不同……我只是在这里更改了名称。 ToolbarVC 的代码只有属性的综合,dealloc 中的释放方法和 viewdidLoad 中的调整按钮大小和更改标题。在 AppViewController 中,我导入了标题并以这种方式创建了一个名为 photoToolbarVC 的变量:ToolbarVC* photoToolbarVC;
你的@implementation
块中有@synthesize button1, button2, button3, button4;
吗?
我知道所有属性都有效,因为我在 ToolbarVC 的 viewDidLoad 创建时使用它们。例如,[self.button1 setTitle:@"Button 1" forState:UIControlStateNormal];
讨厌。我找到了。原来引用已被释放并且可以访问。两天后发布声明。更糟糕的是,我在这里发帖一小时后发现它。 :(
【参考方案1】:
讨厌。我找到了。原来引用已被释放并且可以访问。两天后发布声明。更糟糕的是,我在这里发帖一小时后发现它。 :(
【讨论】:
以上是关于子类视图控制器收到错误“不符合键值编码”的主要内容,如果未能解决你的问题,请参考以下文章
升级到 xCode 4 后,我收到数百万个“此类不符合键值编码”错误