【问题标题】:Setup BOOL property in Model在模型中设置 BOOL 属性
【发布时间】:2017-12-19 06:16:59
【问题描述】:

在 Objective-C 中自定义一个 iOS 应用。对语言不是很熟悉,设置布尔属性这个简单的任务花了我太长时间。

有人可以在这里提供一些建议吗?

视频.h

@property (nonatomic, retain) NSNumber * hasCustomThumbnail;

视频.m

@implementation Video
     @dynamic hasCustomThumbnail;
@end

OtherFile引用视频

// have tried these two an many other things...
video.hasCustomThumbnail = [NSNumber numberWithBool:NO];
video.hasCustomThumbnail = @NO;

无论我尝试了多少种方法,我得到的错误是:

'NSInvalidArgumentException', reason: '-[Video setHasCustomThumbnail:]: unrecognized selector sent to instance 0x60c0004925c0'

尝试了很多建议,包括:Using a BOOL property

我也知道视频引用正确,因为在我开始输入时自动完成提示“hasCustomThumbnail”。

我简直不敢相信 OBJ-c 做这个有多难:-)

有什么建议吗?

【问题讨论】:

  • Video的超类是什么? Video 是如何声明的?
  • @alexr101 请检查我的答案。
  • Video是CoreData对象的表示吗?

标签: objective-c


【解决方案1】:

问题在于您已将其声明为 @dynamic。只需从 Video.m 中删除此行。 Xcode 会自动合成 getter 和 setter。

这两种方法都有效。

[obj setHasCustomThumbnail:[NSNumber numberWithBool:true]];
obj.hasCustomThumbnail = [NSNumber numberWithBool:true];

@dynamic 只是告诉编译器 getter 和 setter 方法 不是由类本身实现的,而是在其他地方实现的(比如 超类或将在运行时提供)。

@synthesize 将为您的属性生成 getter 和 setter 方法。

因此,当您使用 @dynamic 定义属性时,您的超类或运行时应该提供必要的 getter 和 setter。这里没有人提供任何东西,这就是它说 unrecognized selector 发送到实例的原因。只有当它无法为对象找到合适的方法时才会出现此错误。希望这能消除您的疑虑。

@dynamic 的一个实际用途是,当您从 NSManagedObject,核心数据将为 属性。

【讨论】:

  • 它有效,伙计。我也有一个带有示例的项目。错误非常简单。从 Video.m 中删除 @dynamic。默认情况下,将合成所有属性。 stackoverflow.com/questions/1160498/…
  • 更新了更多解释。如果您的问题已解决,请标记它。否则,请告诉我或发表评论。
  • 我的坏 Kumar,我今天早上匆匆完成了答案,但没有阅读综合建议。用合成替换动态就可以了。非常感谢您为我节省了很多时间!
【解决方案2】:

此问题与 BOOL 或 NSNumber 无关。这是由于您在视频类上调用 setIsCustomThumbnail。

你正在做video.isCustomThumbnail =[video setIsCustomThumbnail:],但你的班级没有声明这个isCustomThumbnail。从您的代码看来,您将 isCustomThumbnail 拼错为 hasCustomThumbnail。

所以下定决心,用一个名字。

【讨论】:

  • 我可以看到你的想法。但那是错误的。在我所有的实验过程中,我多次更改了名称,但目前所有名称都匹配,这只是我的问题中的一个错字。
  • 然后更正下一个试图回答您问题的人的错字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多