2010-11-16 58 views
0

我试图学习目标C的协议。我写了两个文件,第一个是FirstViewController.h,其中有一个协议“打印”。我使用委托方法“print”在successViewController中声明FirstViewController类。 问题是控制台输出为“C”的原因。为什么我不能得到“B”输出?为什么协议方法没有执行?一个Objective-C协议的问题

#import <UIKit/UIKit.h> 
#import "FirstViewController.h" 
@interface successViewController : UIViewController <FirstViewControllerDelegate> { 
} 
@end 

#import "successViewController.h" 
#import "FirstViewController.h" 
@implementation successViewController 
- (void)viewDidLoad { 
FirstViewController *firstViewController= [[FirstViewController alloc] init]; 
firstViewController.delegate=self; 
NSLog(@"C"); 
[super viewDidLoad]; 
} 
-(void) print{ 
NSLog(@"B"); 
} 
@end 

#import <Foundation/Foundation.h> 
@class FirstViewController; 
@protocol FirstViewControllerDelegate <NSObject> 
- (void) print; 
@end 
@interface FirstViewController : NSObject { 
id <FirstViewControllerDelegate> delegate; 

} 
@property (nonatomic, assign) id <FirstViewControllerDelegate> delegate; 
@end 

#import "FirstViewController.h" 
@implementation FirstViewController 
@synthesize delegate; 
@end 

回答

0

你需要给你打电话要使用的方法。

[successViewController print];

1

因为你永远不调用print方法。你在哪里期待它被称为?

Objective-C协议允许您指定一个类能够执行某些操作。在你的例子中,successViewController被宣布为FirstViewControllerDelegate,这意味着它能够处理其代表FirstViewController所要求的职责。它更多是类之间的编程契约,可以由编译器验证。作为一个方面说明,Objective-C中的类应始终以大写字母开头,方法应始终以小写字母开头。您的FirstViewController遵循此规则,但successViewController不符合。

0

您从不打电话给代表print方法。代表不能阅读您的想法并自动调用内容。让我们举一个小例子,说明代表如何工作。

假设我们有一个名为Delay的类,它唯一要做的就是等待start被调用的时间,然后告诉它的委托它已经等待。可选地,代理可以告诉Delay等待多久,如果客户不在意,则假定1秒的延迟。

一些规则:

  1. 的所有委托方法第一个参数应该是发送者本身,从来没有不带参数的委托方法。
  2. 委托方法名称应包含一个关键词:
    1. will - 如果事情无法避免发生之前被调用的方法。示例applicationWillTerminate:
    2. did - 如果方法在发生某事之后被调用。例如scrollViewDidScroll:
    3. should - 如果该方法返回一个BOOL如果发生什么信号。例如textFieldShouldClear:
  3. 名称的方法来告诉发生了什么,你所期望的委托做什么。
    1. 唯一的例外是,如果客户需要返回一些东西,那么应该是某个名称的一部分。例如:tableView:editingStyleForRowAtIndexPath:

下面是简单的定义和实施。请注意,我甚至不检查代理是否已设置,因为nil上的调用方法无论如何都被忽略。

// Delay.h 
@protocol DelayDelegate; 

@interface Delay : NSObject { 
@private 
    id<DelayDelegate> _delegate; 
} 
@property(nonatomic, assign) id<DelayDelegate> delegate; 
-(void)start; 
@end 

@protocol DelayDelegate <NSObject> 
@required 
-(void)delayDidComplete:(Delay*)delay; 
@optional 
-(NSTimeInterval)timeIntervalForDelay:(Delay*)delay; 
@end 


// Delay.m 
@interface Delay 
@synthesize = delegate = _delegate; 

-(void)start { 
    NSTimeInterval delay = 1.0; 
    if ([self.delegate respondsToSelector:@selector(timeIntervalForDelay:)]) { 
    delay = [self.delegate timeIntervalForDelay:self]; 
    } 
    [self performSelector:@selector(fireDelay) withObject:nil afterDelay:delay]; 
} 

-(void)fireDelay { 
    [self.delegate delayDidComplete:self]; 
} 
@end