语义问题:没有用于分配给属性的 setter 方法'setisSelected:'



我是Objective-C的新手,事实上我已经开始学习它几个小时了。

我正在看斯坦福大学关于iOS开发的最新讲座,在第二堂课中,Hegarty开始添加一个点击后被选中的基本按钮。非常基本的东西,但我不知道是什么导致我的XCode出现这个错误,而相同的代码在讲座视频中运行良好。

错误信息如下:

CardGameViewController.m
    Semantic Issue
     No setter method 'setIsSelected:' for assignment to property

我的CardGameViewController.h文件:

#import <UIKit/UIKit.h>
@interface CardGameViewController : UIViewController
@end

这是我的CardGameViewController.m文件:

#import "CardGameViewController.h"
@interface CardGameViewController ()
@end
@implementation CardGameViewController
- (IBAction)flipCard:(UIButton *)sender
{
    sender.isSelected  = !sender.isSelected;
}
@end

我使用XCode 4.6.3版本,构建一个单视图iPhone应用程序,在iPhone 6.1模拟器中运行它。

我在视频中观察到的属性isSelected的一个差异是,在视频中isSelected继承自UIControl,而在我的代码中,当alt-click说它继承自UITableViewCell时出现的小文档。

我想这可能是这个错误背后的原因,但我不知道这些术语是什么意思。

有人能帮我解决这个问题吗?提前感谢!

对于特定@propertyBOOL值来说,使用稍微不同的方法模式并不罕见,即setter是-set<property>:,而-is<property>有另一个getter,这在通过属性或KVC访问时可能会引起一些混淆。

在这种情况下,正如@shem指出的那样,您正在寻找的属性是selected,即使如果您要向它发送消息(例如[sender isSelected]),它在API中暴露为-isSelected

你可以在UIControl的属性声明中看到这一点(因为UIButtonUIControl的子类):

@property(nonatomic, getter=isSelected) BOOL selected

注意,它覆盖了getter,表明用于实现selected属性的消息实际上是-setSelected:-isSelected。但是,最后,这并不影响您在使用点表示法时访问属性的方式,它始终只是sender.selected

这只有在查看使用方法调用然后使用属性实现的示例代码时才真正重要。

selected而不是isSelected:

- (IBAction)flipCard:(UIButton *)sender
{
    sender.selected  = !sender.selected;
}

最新更新