0

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

#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
4

3 回答 3

1

因为您从不调用该print方法。你期望它在哪里被调用?

Objective-C 协议允许您指定一个类能够执行某些操作。在您的示例中,successViewController声明了FirstViewControllerDelegate,这意味着它能够处理FirstViewController其代表所需的职责。它更像是类之间的一种编程契约,可以由编译器验证。

作为旁注,Objective-C 中的类应始终以大写字母开头,方法应始终以小写字母开头。您FirstViewController遵循此规则,但successViewController不遵循此规则。

于 2010-11-16T09:07:24.910 回答
0

您需要调用要使用的方法。

[successViewController print];

于 2010-11-16T09:04:09.050 回答
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
于 2010-11-16T10:35:16.447 回答