2011-09-24 71 views
0

我知道的參數發送給一個選擇,我們使用withObject,但如何處理以下情況:如何將參數發送到選擇器?

UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:[[NavigatorUtil new] autorelease] action:@selector(back:) ]; 

背面方法是這樣的:

#import "NavigationUtil.h" 

@implementation NavigationUtil 

+(void) back: (UINavigationController*) navigationController 
{ 
    [navigationController popViewControllerAnimated:YES]; 
} 

@end 

現在我需要發送參數給這個選擇器?如何?

回答

0

你是什麼意思「發送參數給這個選擇器」?這個短語不計算。

它接合我,你應該RTFM一點,例如iOS的事件處理指南。

總之,按鈕的「動作」是按鈕發送到其目標的消息。在Objective-C中,消息由其選擇器定義,可以或多或少地被視爲方法名稱和簽名。

按鈕知道這個選擇器的三個簽名:零個,一個或兩個參數。在你的情況下,你使用一個參數的方法。你不能決定它將會是什麼。這個說法總是一樣的。這將是發件人,即按鈕本身。

所以這是問題#1與您的行動方法。

問題2與您的操作方法是,您將其定義爲類方法。它應該是一個實例方法。

現在終於,如果你想從NavigatonUtil到達UINavigationController,你需要找到另一種方法。例如事先將其作爲實例變量進行存儲。

+0

看來的'實例NavigationUtil'跨越其中要求的方法,所以我已經聲明它作爲ViewController中的實例變量和它完美的工作。謝謝。 –

0

當提供選擇器作爲動作時,通常依賴於成員(iVar)變量。

就你而言,將導航控制器存儲爲iVar,然後從選擇器操作中引用它。

另外,您將它設置爲代碼,但如果您想要將該方法作爲接口構建器中的操作綁定,則應該使其返回IBAction,編譯器將解析爲無效,但這是接口提示建設者。注意它不應該是一個類方法。

- (IBAction) back 
{ 
    [[self _navigationController] popViewControllerAnimated:YES]; 
} 

你可以看看另一種選擇是塊,其允許發送具有參數或內聯提供的代碼塊時要避免構件狀態(例如異步/並行代碼),這也有助於方法。

結帳這個SO文章:

UIButton block equivalent to addTarget:action:forControlEvents: method?

希望幫助

+0

謝謝你的回答,但我認爲我仍然是iphone新手,以瞭解iVar和C-Blocks .. –

相關問題