2014-02-06 43 views
14

我有一個父視圖控制器和一個子視圖控制器。在子視圖控制器的視圖中,我有一個名爲「startButton」的UIButton。到該按鈕,我添加了一個目標如下抑制Xcode 5中的「未聲明的選擇器」警告

[startButton addTarget:[self parentViewController] action:@selector(test:) forControlEvents:UIControlEventTouchUpInside]; 

我已經實現,測試:方法父控制器和這工作完全正常的我。輕擊按鈕時,事件從子視圖控制器傳遞到父視圖控制器,並在test:method內執行代碼片段。

但我的問題是,我收到一條警告消息,「未聲明的選擇器測試:」。我知道,我得到它是因爲測試:未在子視圖控制器實現文件中實現。

有沒有辦法單獨禁止這個警告?我在這裏看到的大部分建議都會讓整個警告得到抑制,但我想單獨禁止上述警告。

感謝

+1

應該有測試方法在你parentViewController –

+0

的可能重複[動態轉發:禁止未完全執行警告(http://stackoverflow.com/questions/14444203/dynamic-forwarding-suppress-incomplete-implementation-警告) – Popeye

+0

@Popeye它不是這個問題的重複,因爲它是一個他想壓制的不同的警告。 –

回答

15

如果您確定自己已經做得正確,並且代碼確實可以正常工作,那麼您可以通過圍繞方法來阻止Xcode警告您使用#pragma clang預處理器命令。

例如:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wundeclared-selector" 

[startButton addTarget:[self parentViewController] action:@selector(test:) forControlEvents:UIControlEventTouchUpInside]; 

#pragma clang diagnostic pop 

PUSH和POP指令之間的任何 '丟失消息' 將不會受到的Xcode的報道。我建議他們之間儘可能少用代碼,以防止代碼中的實際問題未被報告。

+2

上面的答案不適合我。替換#pragma ide診斷被忽略的「UnresolvedMessage」,#pragma clang診斷被忽略「-Wundeclared-selector」,它起作用。 – Pellet

+0

謝謝@Pellet。你使用的是哪個版本的Xcode?有可能這個答案現在已經過時 –

+0

不用擔心,Xcode 5 – Pellet

0

你總是可以實現測試:在子視圖控制器,並執行以下操作:

- (void)test:(Parameters)param { 
     [self.parentViewController test:param]; 
} 

編輯的目標自我代替[自parentViewController]

15

沒有必要抑制警告,如果你能避免

聲明父視圖控制器, 在接口test:方法(.h文件)和導入。 h文件中的子視圖控制器的實現(.m)文件。

然後編譯器知道該方法,並且您不會再收到關於未聲明的選擇器的警告。

1

下面的代碼將讓這個警告的消失(dynamic create selector).但是,如果未聲明中parentviewcontroller它會在運行時崩潰。

[startButton addTarget:[self parentViewController] action:NSSelectorFromString(@"test:") forControlEvents:UIControlEventTouchUpInside]; 
+0

明智的答案。 – tounaobun

0

另一種選擇是協議中聲明它(同一個文件中選擇使用或內它包括頭部):

@protocol DummyProtocolToForwardDeclareSelector 
-(void)test:(BOOL)testArgument; 
@end 

這將打壓警告僅此特定選擇,但你可以添加其他人相同的協議。

0

另一種更可能更正確的選擇是擴展具有選擇器所針對方法的類的接口。

@interface ClassThatHasTargetOfSelector() 
-(void)test:(BOOL)testArgument; 
@end