2013-12-13 25 views
0

早上好,錯誤:[DataDisplayViewController - ddvcLoadedRcv]無法識別的選擇器發送到實例

我想請求澄清重新。標題中提到的錯誤消息的具體實例。我認識到這個錯誤已經在&之前討論過很多次了,我已經查看了大約10個這些線程,看看我能否找到我的問題的答案,但我不能這麼想。忍受着我。

我的應用程序使用iPhone來控制在PC上運行的程序的操作。它是根據該程序定製的,而不是使用通用VNC。它使用帶有4個屏幕的tabBarController。與第一個選項卡關聯的viewController啓動「模型」,該模型是與PC上的服務器進行通信的客戶端。第二個和第三個VC具有通過客戶端向服務器發送命令的按鈕。所有的工作都很好。

我的問題是與第四個VC旨在顯示通過客戶端從服務器接收的數據。當客戶端(即模型)接收到顯示數據時,我試圖使用NSNotification(在userinfo中附加一個數據數組)向第四個VC發送消息,告訴它更新其標籤的文本屬性。我的第一次嘗試導致類似於問題標題中的錯誤消息。我推測這是因爲第一個數據發送給它時,第四個VC尚未創建。爲了避免這種情況,我在模型中添加了一個條件,以便它一旦加載就不會發送數據,直到它從第4個VC接收到一條消息。但是,當執行到達發送通知的第4個VC的ViewDidAppear中的行時,標題中會顯示錯誤消息。

同樣,閱讀其他線程,我的結論是,因爲該模型已經出來的內存和4 VC被替換它找不到模型類的選擇。因此它在第四個VC中尋找選擇器並且找不到它。所以,對於那些長時間的前言,我的問題是如何將我的「模型」保留在內存中,以便通知具有適當的目的地。

下面是從顯示通知設置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 VC來實例化模型的一些代碼:

// 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,所以我從來沒有想過要改變它。但是,當我試圖將「self」更改爲VVC_Communication_Module類型的對象時,儘管我已導入.h文件,但x代碼不會公開它。如果有其他人有這個問題,我會回答我自己的問題,以顯示我必須做的事情。 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)中。

不過,我也只好把通知中的類方法initialize設立和在線程描述做出選擇一個類的方法「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; 
} 

我不得不改變選擇返回我用它,而不是原來的ddvcLoaded BOOL一個BOOL。

RB

相關問題