我不喜欢躺着的警告,这个一直困扰着我。关于我做错了什么的任何想法?我有很多使用同样方法的属性,但没有一个给我警告。为什么Xcode不识别这个?
当应用程序按预期工作时,Xcode给了我以下编译时警告:
'OnlinePeerBrowser' may not respond to '-setMyParent:'
我在OnlinePeerBrowser.h中的属性声明
#import "WelcomeViewController.h"
@interface OnlinePeerBrowser : UIViewController <UITableViewDelegate, UITableViewDataSource, NSNetServiceBrowserDelegate> {
WelcomeViewController *_myParent;
}
@property (nonatomic, assign) WelcomeViewController *myParent;
OnlinePeerBrowser.m有
@synthesize myParent=_myParent;
我在WelcomeViewController.m中的setMyParent上收到警告......
#import "WelcomeViewController.h"
#import "OnlinePeerBrowser.h"
@implementation WelcomeViewController
- (void)peerPickerController:(GKPeerPickerController *)picker didSelectConnectionType:(GKPeerPickerConnectionType)type {
...
OnlinePeerBrowser *controller = [[OnlinePeerBrowser alloc]
initWithNibName:@"OnlinePeerBrowser" bundle:nil];
[controller setMyParent:self];
}
另外,奇怪的是我不能在这里使用点语法。
controller.myParent = self;
给了我以下错误:
/Users/vesselhead/Development/iPhone/DJBox/WelcomeViewController.m:254: error: request for member 'myParent' in something not a structure or union
我觉得我必须遗漏一些非常简单的东西。
答案 0 :(得分:2)
您发布的代码看起来是正确的。这意味着编译器正在从某个地方引入OnlinePeerBrowser
类的另一个声明。
检查循环导入。
检查您是否拥有OnlinePeerBrowser.h文件的多个副本。
将行#warning Testing
添加到OnlinePeerBrowser.h文件中。编译时,该警告应出现在日志中。如果没有出现该警告,则编译器不会接收该文件。
如果是循环导入,则不要在“OnlinePeerBrowser.h”中导入“WelcomeViewController.h”。相反,在OnlinePeerBrowser.h中使用前向声明,例如@class WelcomeViewController
,并在OnlinePeerBrowser.m中导入“WelcomeViewController.h”
答案 1 :(得分:1)
有时,Circular Imports会在编译器中产生问题。 而不是使用
#import "WelcomeViewController.h"
在OnlinePeerBrowser.h中将该行移动到OnlinePeerBrowser.m并添加
@class WelcomeViewController
到OnlinePeerBrowser.h
这将允许您将myParent和_myParent的类设置为WelcomeViewController,而不是循环导入。
<强>替代地强>:
您可能想要使用WeclomeViewController必须遵守的@protocol。然后你只需要在一个方向上导入类。
协议属性的实现将如下所示
//#import "WelcomeViewController.h"
@protocol OnlinePeerBrowserParent <NSObject>
@required
- (NSString*) informationFromParent;
@end
@interface OnlinePeerBrowser : UIViewController <UITableViewDelegate, UITableViewDataSource, NSNetServiceBrowserDelegate> {
id<OnlinePeerBrowserParent> _myParent;
}
@property (nonatomic, assign) id<OnlinePeerBrowserParent> myParent;
注意协议在OnlinePeerBrowser.h上,因此您可以导入OnlinePeerBrowser.h并默认获取协议。
最后你在WelcomeViewController中实现了这样的协议
@implementation WelcomeViewController<OnlinePeerBrowserParent>
- (NSString*) informationFromParent
{
return @"My Parental Info";
}
...... etc