没有可见的@interface 声明选择器

Posted

技术标签:

【中文标题】没有可见的@interface 声明选择器【英文标题】:No visible @interface declares the selector 【发布时间】:2013-12-11 18:50:47 【问题描述】:

我有一个SSLYFoodDetailViewController.h,其内容是

#import <UIKit/UIKit.h>

@interface SSLYFoodDetailViewController : UIViewController

@property(nonatomic, weak) NSString *foodItem;
@property(nonatomic, weak) NSString *restaurantName;

- (void) setFoodItem:(NSString *)foodItem;
- (void) setRestaurantName:(NSString *)restaurantName;

@end

prepareForSegue方法内的另一个文件SSLYTableViewController.m中,我尝试执行以下操作-

SSLYFoodDetailViewController *sslyFoodDetailViewController = [segue destinationViewController];
[sslyFoodDetailViewController setFoodItem:@"Pasta"];

XCode 给我一个错误,指出存在 No visible @interface for 'SSLYFoodDetailViewController' declares the selector 'setFoodItem'

SSLYTableViewController.m 的顶部,我有导入语句 -

#import "SSLYFoodDetailViewController.h"

我错过了什么?

【问题讨论】:

该错误消息暗示您在某处调用setFoodItem 时不带参数。 1.您不需要声明设置器: - (void) setFoodItem:(NSString *)foodItem; - (void) setRestaurantName:(NSString *)restaurantName; 2. XCode 有时是一件令人讨厌的事情。尝试清理并构建甚至删除派生数据和/或退出 XCode 并重新启动。顺便说一句:您确定要弱引用属性吗? 为什么要声明这些属性weakNSString 属性的最佳实践是将它们声明为 (nonatomic, copy) 好吧,我会读到关于使用 (nonatomic, copy) 的信息——我对 Objective-C 很陌生,而且不知道很多东西。 【参考方案1】:

这没有任何意义,除了 setFoodItem: 隐含在 foodItem @property 声明中。

尝试在您的标头中删除 setFoodItem:setRestaurantName: 的声明 - 这绝对不会有任何影响,因为它们是多余的。

如果这不起作用,请尝试使用属性访问器表示法:

sslyFoodDetailViewController.foodItem = @"Pasta";

另外值得注意的是,您可能会收到一条警告:

SSLYFoodDetailViewController *sslyFoodDetailViewController = [segue destinationViewController];

您应该在该行中添加显式转换,如下所示:

SSLYFoodDetailViewController *sslyFoodDetailViewController = (SSLYFoodDetailViewController *) [segue destinationViewController];

【讨论】:

谢谢。我试过了,但这也没有用。然后我删除了SSLYFoodDetailViewController.h.m 文件)并再次创建它们。它奏效了——也许 XCode 表现得很好。我知道我不需要显式声明 setter 方法,现在它可以使用它。 @Siddharth 当我确定我做的一切都正确时,我通常会尝试一个项目 > 清洁。

以上是关于没有可见的@interface 声明选择器的主要内容,如果未能解决你的问题,请参考以下文章

如何解决错误'UIViewController'没有可见的@interface声明选择器''

“NSString”没有可见的@interface 声明选择器“performStringGeocode”

没有可见的@interface 声明选择器

“MPMediaItem”没有可见的@interface 声明选择器“representativeItem”

“Appdelegate”没有可见的@interface 声明选择器“managedObjectContext”

____ 没有可见的@interface 声明选择器