没有可见的@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 并重新启动。顺便说一句:您确定要弱引用属性吗?
为什么要声明这些属性weak
? NSString
属性的最佳实践是将它们声明为 (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”
“MPMediaItem”没有可见的@interface 声明选择器“representativeItem”