Мой @property объявлен, но я все еще не могу ответить на предупреждение - PullRequest
2 голосов
/ 22 сентября 2011

Мне не нравятся предупреждения, лежащие вокруг, и это беспокоило меня. Есть идеи, что я делаю не так? У меня есть тонны свойств, использующих этот же подход, и ни одно из них не дает мне предупреждений. Почему 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;

Я получаю предупреждение о setMyParent в WelcomeViewController.m здесь ...

#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

Я чувствую, что, должно быть, упускаю что-то очень простое.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

Код, который вы разместили, выглядит правильно. Это означает, что компилятор извлекает другое объявление класса OnlinePeerBrowser откуда-то.

  • Проверка кругового импорта.

  • Проверьте, есть ли у вас несколько копий файла OnlinePeerBrowser.h.

  • Добавьте строку #warning Testing в файл OnlinePeerBrowser.h. Это предупреждение должно появиться в журнале при компиляции. Если это предупреждение не появляется, то этот файл не принимается компилятором.

Если это циклический импорт, не импортируйте «WelcomeViewController.h» в «OnlinePeerBrowser.h». Вместо этого используйте предварительное объявление в OnlinePeerBrowser.h, например, @class WelcomeViewController и импортируйте «WelcomeViewController.h» в OnlinePeerBrowser.m

1 голос
/ 22 сентября 2011

Иногда циркулярный импорт создает проблему с компилятором.Вместо использования

#import "WelcomeViewController.h"

в OnlinePeerBrowser.h переместите эту строку в OnlinePeerBrowser.m и добавьте

@class WelcomeViewController

в OnlinePeerBrowser.h

, это позволит вамчтобы установить класс myParent и _myParent на WelcomeViewController и не иметь циклический импорт.

В качестве альтернативы :

вы можете использовать @protocol, который будет иметь 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...