2013-12-13 1 views
0

Доброго утра,Ошибка: [DataDisplayViewController - ddvcLoadedRcv] непризнанным селектор послал к экземпляру

Я хотел бы попросить разъяснения повторно. конкретный экземпляр сообщения об ошибке, указанного в заголовке. Я признаю, что эта ошибка обсуждалась много раз до & Я просмотрел около 10 из этих потоков, чтобы узнать, могу ли я найти ответ на свою проблему, но я не могу так PLS. потерпите меня.

Мое приложение использует iPhone для управления действиями программы, запущенной на ПК. Он настроен для этой программы, а не с использованием обобщенного VNC. Он использует tabBarController с 4 экранами. Элемент viewController, связанный с первой вкладкой, инициирует «модель», которая является клиентом, который взаимодействует с сервером на ПК. Второй и третий VC имеют кнопки, которые отправляют команды на сервер через клиент. Все отлично работает с ними.

Моя проблема заключается в четвертом VC, который предназначен для отображения данных, полученных с сервера через клиента. Когда клиент (т. Е. Модель) получает данные для отображения, я пытаюсь использовать NSNotification (с прикрепленным массивом данных в userinfo), чтобы отправить сообщение четвертому VC, чтобы сообщить ему об обновлении его текстовых свойств. Моя первая попытка привела к сообщению об ошибке, аналогичному сообщению в заголовке вопроса. Я предположил, что это произошло потому, что 4-й VC не был создан во время отправки первых данных. Чтобы этого избежать, я добавил условие в модель, чтобы он не отправлял данные, пока не получит сообщение от 4-го VC после его загрузки. Однако, когда выполнение достигает линии в 4-м VD ViewDidAppear, где отправлено уведомление, я получаю сообщение об ошибке в заголовке.

Снова, читая другие темы, я пришел к выводу, что он не может найти селектор в классе модели, потому что модель ушла из памяти и была заменена 4-м VC. Следовательно, он ищет селектор в 4-м VC и не может его найти. Итак, извиняясь за этот длинный pre-amble, мой вопрос заключается в том, как сохранить свою «модель» в памяти, чтобы уведомление имело подходящее место назначения.

Вот код из 4 VC показывает уведомление настроить и т.д.

// DataDisplayViewController.m 

#import "DataDisplayViewController.h" 
#import "VVViewController.h" 
#import "VVC_Communication_Module.h" 

@interface DataDisplayViewController() 
@property (nonatomic, strong) NSMutableArray *rideData; 
@end 

@implementation DataDisplayViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ddvcLoadedRcv) name:@"ddvcLoadedEvent" object:nil]; 
} 

- (void) viewDidAppear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ddvcLoadedEvent" object:nil]; 
} 

@end 

Вот код из модели показывает селектор, который должен получить уведомление.

// VVC_Communication_Module.m 

#import "VVC_Communication_Module.h" 
#import "VVViewController.h" 
#import "DataDisplayViewController.h" 

@interface VVC_Communication_Module() 
@property (nonatomic, strong) NSArray *itemArray; 
@property (nonatomic) BOOL ddvcLoaded; 
@end 

@implementation VVC_Communication_Module 
@synthesize itemArray; 
@synthesize ddvcLoaded = _ddvcLoaded; 

- (BOOL) ddvcLoaded 
{ 
    _ddvcLoaded = NO; 
    return _ddvcLoaded; 
} 

- (void) ddvcLoadedRcv:(NSNotification *) notification 
{ 
    _ddvcLoaded = YES; 
} 

@end 

Наконец, некоторый код, с 1-го ВК, который создает модель:

// VVViewController.m 

#import "VVViewController.h" 
#import "DataDisplayViewController.h" 
#import "VVC_Communication_Module.h" 

@interface VVViewController() 
@property (nonatomic, strong) VVC_Communication_Module *moduleRxTx; 
@end 

@implementation VVViewController 
@synthesize moduleRxTx = _moduleRxTx; 

- (VVC_Communication_Module *)moduleRxTx 
{ 
    if (!_moduleRxTx) _moduleRxTx = [[VVC_Communication_Module alloc] init]; 
    return _moduleRxTx; 
} 

@end 

Спасибо за все, и любая помощь вы можете предложить. RB

ответ

0

вы вводите @selector(ddvcLoadedRcv), но это должно быть @selector(ddvcLoadedRcv:), потому что ваш метод принимает аргумент. furhermore вы сообщите уведомление о том, что метод ddvcLoadedRcv: находится в «Я», но вы должны указать на объект типа VVC_Communication_Module, где определен метод

+0

Спасибо вам за быстрый ответ. Ты посадил меня на правильный путь. Первоначально я включил двоеточие, но вынул их во время отладки, чтобы увидеть, не изменилось ли это - теперь они вернулись. Однако ключевым моментом было указание на «я». Все примеры, которые я видел при использовании NSNotification, имели addObserver: self, поэтому мне никогда не приходило в голову изменить его. Однако, когда я попытался изменить «я» на объект типа VVC_Communication_Module, x-код не мог бы его отобразить, хотя я импортировал файл .h. Если у кого-то еще есть эта проблема, я отвечу на свой вопрос, чтобы показать, что я должен был сделать. RB – rbwater

+0

, конечно, вы должны импортировать файл .h, и при добавлении наблюдателя вы должны иметь экземпляр объекта во время выполнения и ссылку на этот объект. – thorb65

0

Моя проблема может быть вызвана тупого Noobie недоразумение, но в случае, если кто-то еще имеет ту же проблему, я быстро объясню, что я сделал не так.

Оказалось, что оба уведомления установить:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ddvcLoadedRcv) name:@"ddvcLoadedEvent" object:nil]; 

и селектор:

- (void) ddvcLoadedRcv:(NSNotification *) notification 

должен был быть в том же классе, т.е. VVC_Communication_Module.

Сообщение отправителя осталось в классе, отправив сообщение (DataDisplayViewController).

Однако, я также должен был поместить уведомление, установленный в методе инициализации класса и сделать селектор метода класса, как описано в теме «NSNotification addObserver: someOtherClass»

Итак, наконец, соответствующая часть VVC_Communication_Module. м выглядит следующим образом:

#import "VVC_Communication_Module.h" 
#import "VVViewController.h" 
#import "DataDisplayViewController.h" 

@interface VVC_Communication_Module() 
+ (void) initialize; 
@end 

@implementation VVC_Communication_Module 

+ (void)initialize 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ddvcLoadedRcv:) name:@"ddvcLoadedEvent" object:nil]; 
} 

+ (BOOL) ddvcLoadedRcv:(NSNotification *) notification 
{ 
    return YES; 
} 

я должен был изменить селектор для возврата BOOL, который я использовал, а не оригинальный ddvcLoaded BOOL.

RB