2011-07-20 46 views
2

我試圖實現一個協議。如何將值傳遞給@protocol

我已經看過文檔here,我理解這些概念,但我認爲我錯過了一些東西。

我想讓一個用戶點擊表格視圖中的文件名觸發'didSelectRowAtIndexPath',它將依次通知委託,用戶選擇了一個文件(觸發委託中的didSelectFileName)並傳遞文件名。我宣佈協議如下:

@protocol FileList <NSObject> 
- (void)didSelectFileName:(NSString *)fileName;  
@end 

我的問題是:

  • 我如何設置文件名「」值,這樣,當「didSelectFileName」被稱爲它有它的當前值
  • 我如何告訴我的代碼在代理中觸發'didSelectFileName'。

回答

1

//在表中查看方法

- (void)tableView didSelectRowAtIndexPath....... { 
UITableViewCell *cell = [tableView methodToGetCell]; 
if(delegate && [delegate respondsToSelector:@selector(didSelectFileName:)]){ 
[delegate didSelectFileName:cell.text]; 
} 
+0

當你簡單地將代表強制轉換爲'id '時,你不需要較慢的' - [respondsToSelector:]'因爲你已經知道它響應那個選擇器,因爲在給定的協議中它沒有被定義爲' @ optional'。如果你說委託符合協議,但沒有實現所有協議所需的方法,這是一個編程錯誤(並且編譯器會給出警告)。 – 2011-07-20 12:59:31

+0

@WTP我同意你的看法,但有時如果我們沒有實現協議方法,編譯器只會在錯誤的時候給出警告,如果我們忘記實現應用程序將會崩潰,但如果我們檢查使用響應選擇器應用程序不會崩潰。這就是我寫這一行的原因。感謝您的信息 –

+0

@WTP您可以在示例中解釋這件事 - (void)doSomethingWithThisObject:(id )aObject ...(id )的用法如果我們使用它,我認爲我們不需要在符合此協議的另一個類的接口中添加名稱。我對嗎?請澄清像MyCLass:UIView 這裏我們不需要添加這個,如果我們傳遞它的方法? –

3

你不能只是發送消息給協議(也不能設置值)。您將消息發送到符合協議的類。


當你說一類遵循的協議(@interface MyClass : NSObject <MyProtocol> { etc),您可以安全地發送任何消息給類符合在協議的方法的選擇。

因此,如果我們把你的協議,比如我們可以有一個類,可以將消息發送到委託:

@interface MyClass : NSObject { 
    id<FileList> _delegate; 
} 

@end 

@implementation MyClass 

- someMethod { 
    NSString *fn = @"Hello."; 
    [_delegate didSelectFileName:fn]; 
} 

@end 

只要確保你實現,在您的方案中您委派的方法。

您不需要重新定義委託類的接口中的方法。


這裏有一些很好讀取有關協議: