这个类不符合键值编码的要求,针对键...

8

我在项目中有一个实体的详细界面(实际上是“照片”),可能会有评论。如果有评论,屏幕会显示最近的3条评论和“查看全部”按钮。问题在于如何显示这3条评论。(在Android上,我只需使用LinearLayout即可。)根据我的判断,TableView不太适合(由于高度静态),因此我决定创建自定义模板/部分视图CommentView,并将其添加到每个评论的scrollView中。

我创建了一个具有视图和一些子控件(用户照片、用户名、日期、文本)的XIB文件。同时,我创建了从UIView派生出来的CommentView类。文件的所有者设置为CommentView。顶级视图的类也设置为CommentView(我尝试了各种组合)。我从顶级视图(vContent)和所有子视图创建了outlet。

这是CommentView.h:

@interface CommentView : UIView

@property (strong, nonatomic) IBOutlet CommentView *vContent;
@property (weak, nonatomic) IBOutlet UIImageView *ivUserPhoto;
@property (weak, nonatomic) IBOutlet UILabel *lUserName;
@property (weak, nonatomic) IBOutlet UILabel *lCreated;
@property (weak, nonatomic) IBOutlet UILabel *lText;


@end

这是CommentView.m文件:
#import "CommentView.h"

@implementation CommentView

-(void)awakeFromNib {
    [[NSBundle mainBundle] loadNibNamed:@"CommentView" owner:self options:nil];
    [self addSubview: self.vContent];
}

@end

我尝试在实体的视图中添加注释,但遇到了标题中的错误。这不是我第一次遇到这个问题,但现在我真的不知道问题出在哪里...

错误发生在此行(我从PhotoViewController调用它):

CommentView *commentView = [[[NSBundle mainBundle] loadNibNamed:@"CommentView" owner:self options:nil]objectAtIndex:0];

图片描述

完整文本: '[ setValue:forUndefinedKey:]: 此类不符合键值编码规范,无法为 ivUserPhoto 设置值。'

非常感谢您的帮助!谢谢!


你看过许多已有的问题,是否涵盖了这个相同的错误信息? - rmaddy
原因很简单。PhotoViewController不是一个CommentView,但在某个地方(可能是你的nib文件)你把它当作了CommentView来处理。 - Brad Allred
@Brad Allred 可能在这里:CommentView *commentView = [[[NSBundle mainBundle] loadNibNamed:@"CommentView" owner:self options:nil]objectAtIndex:0]; (owner: self)。但是我应该在那里写什么,而不是self呢? - Dmitry Sikorsky
@BradAllred 已经设置好了。也许问题出在我尝试将自定义视图添加到父视图的方式上?我的意思是,也许我不应该在 PhotoViewController 中使用 loadNibNames,而是使用 CommentView cm = [[CommentView alloc]initWithFrame]?我也尝试过这样做。没有错误,但也没有显示任何视图... - Dmitry Sikorsky
我发现如果我在loadNibNamed中将另一个对象作为owner,错误文本会更改为该对象的类型。所以这可能是原因。但在这种情况下,我不知道我应该放什么代替“self”。那么也许我将这个子视图添加到父视图的方式是错误的... - Dmitry Sikorsky
显示剩余2条评论
2个回答

9
我在这里找到了另一个例子。所以我将我的CommentView.m重写为以下内容...
@implementation CommentView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self) {
        NSArray *nibContents = [[NSBundle mainBundle]loadNibNamed:@"CommentView" owner:self options:nil];
        [self addSubview:nibContents[0]];
    }

    return self;
}

@end

我正在这样添加子视图:

CommentView *commentView = [[CommentView alloc]initWithFrame:CGRectMake(0, 0, 320, 81)];

commentView.lUserName.text = comment.user.name;
[self.vComments addSubview:commentView];

现在它按我的预期工作。

我仍然不完全理解为什么有很多像我问题中的例子,以及为什么它对我不起作用... 我希望我的代码能够为某些人节省时间...


这真是救了我的命!我在不同的问题中看到了很多类似的答案,但对我来说关键是调用loadNibNamed而不是其他情况下使用的instantiateWithOwner。谢谢! - dustinrwh

0

这个问题意味着你的 xib 映射有误。这通常发生在你改变属性名称时。

为了确保不遗漏问题,请转到您的 xib 文件,断开所有输出口并重新映射它们。


在发布问题之前,我已经尝试了几次 :( - Dmitry Sikorsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接