2012-05-17 89 views
4

我以为终于理解了委托的概念,直到发生以下情况:我更改了头文件以删除对委托的引用,并且Alert仍然有效。唯一的区别是我失去了代码提示。为什么我不需要在头文件中声明UIAlertViewDelegate?

//.h 
#import <UIKit/UIKit.h> 
//@interface ViewController : UIViewController <UIAlertViewDelegate> 
@interface ViewController : UIViewController 
- (IBAction)showMessage:(id)sender; 
@end 

//.m 
#import "ViewController.h" 
@implementation ViewController 
- (IBAction)showMessage:(id)sender { 
    UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Hello World!" 
                 message:@"Message." 
                delegate:self 
              cancelButtonTitle:@"Cancel" 
              otherButtonTitles:@"Button 1", @"Button 2", nil]; 
    [message show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; 

    if([title isEqualToString:@"Button 1"]) 
    { 
     NSLog(@"Button 1 was selected."); 
    } 
} 
@end 
+0

是的...删除它会在构建时生成警告。如果你失去语法突出显示,那是因为Xcode。这不是一种语言功能。 – CodaFi

回答

9

<UIAlertViewDelegate>在你的头只是一个参考到要实现在类的委托方法的编译器。如果您未实现标记为@required的委托方法,则会收到警告,但由于大多数委托方法通常是@optional,因此您的代码将编译并运行良好。这并不意味着你不应该在你的头文件中添加代表。

3

答案是苹果不希望要求一个类来实现UIAlertViewDelegate协议。如果Apple希望要求,那么它会使UIAlertView的代理属性为id<UIAlertViewDelegate>。如果你看文档,事实并非如此。

UIAlertView Class Reference

@property(nonatomic, assign) id delegate

他们一定有他们的理由不使其@property(nonatomic, assign) id<UIAlertViewDelegate> delegate

6

虽然你已经接受了一个答案,但这个问题比这里讨论的要多。

UIAlertViewDelegate协议它实现了委托设计图案。您可能需要也可能不需要通过采用它来正式通知运行时符合任何给定的协议(特别是如果它没有任何必需的方法),但这取决于声明该协议的类的设计。您可以通过将协议名称中<采纳你们班协议>声明类,这样当的:

@interface MyClass : NSObject <delegateProtocolName> 

由于被委派许多协议方法是可选的方法,他们经常进行测试,以查看是否采用类实现一个特定的方法是这样的:

if ([self.delegate respondsToSelector:@selector(delegatedMethod:)]) { 
    // Do something 
} 

在这种情况下,你并不需要,因为它正在测试,看看具体的委托方法已经实施以符合你的头文件的协议。

然而,该测试可以被写成这样(尤其是如果需要引用多个必要方法/在同样的功能性质):

if ([self.delegate conformsToProtocol:@protocol(delegateProtocolName)]) { 
    // Do something 
} 

在这种情况下,必须符合协议在你的头文件中,否则它不会通过测试。

引述(由我加入从The Objective-C Programming Language取出并强调)为conformsToProtocol的文档:

此方法确定一致性仅正规 声明在头文件的基础上,如上述说明。它不检查 以查看协议中声明的方法实际上是否实现了 - 这是程序员的责任。

1

< UIAlertViewDelegate您在您的课上提到>意味着您所用的AlertView代表的这一类,即视图控制器委托方法:自指该对象的该委托方法定义在当前班级中。

如果您想要在任何其他类中定义AlertView委托的方法,那么您必须在该类中提及<UIAlertViewDelegate>并实现该特定类中的方法。

并且还必须更改委托:(classname)。

相关问题