子类视图控制器收到错误“不符合键值编码”

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 后,我收到数百万个“此类不符合键值编码”错误

CoreData 严重应用程序错误:实体不符合键值编码

iOS 不符合键值编码的 uitableview

RestKit 0.20.1 映射本地 JSON “此类不符合键值编码...”

添加了传递数据的委托,现在抛出错误类不符合键值编码?