2011-07-20 42 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 

只要确保你实现,在您的方案中您委派的方法。

您不需要重新定义委托类的接口中的方法。


这里有一些很好读取有关协议: