【发布时间】:2014-04-26 17:42:33
【问题描述】:
我正在尝试实施委托。在自定义类的 .h 文件中,我这样做了
#import <UIKit/UIKit.h>
@class Timer;
@protocol TimerDelegate
-(void)myClassDelegateMethod:(Timer *)timer;
@end
typedef void(^MyCustomBlock)(void);
@interface Timer : UILabel
@property (nonatomic, weak) id <TimerDelegate> delegate;
在 .m 文件中我合成了委托,也调用了委托方法,首先检查委托是否实现了该方法
@synthesize delegate;
-(void)countdownTime:(NSTimer *)timer
{
NSLog(@"countdownTime called");
....
[self.delegate myClassDelegateMethod:self];
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(myClassDelegateMethod:)]) {
[self.delegate performSelector:@selector(myClassDelegateMethod:)];
} else {
NSLog(@"Delegate doesn't implement myClassDelegateMethod");
}
当我运行我的代码时,我被告知委托没有实现该方法。这是我如何实现它 在viewController中,我声明它符合协议
@interface scViewController : UIViewController <TimerDelegate>
然后在viewController的.m文件中,我实现了delegate的方法
- (void) myClassDelegateMethod:(Timer *) sender {
NSLog(@"Delegates are great!");
}
您能解释一下我是如何未能正确实现委托方法的吗?
更新,在viewController中,我有一个创建定时器实例的方法
-(Timer *)timer
{
_timer = [[Timer alloc] init];
return _timer;
}
在 viewDidLoad 中,我这样做
self.timer.delegate = self;
【问题讨论】:
-
你做过
timer.delegate = scViewController吗?即,您是否曾经将委托分配给Timer实例? -
@Rich 谢谢,是的,我在 vc
self.timer.delegate = self;的 viewDidLoad 中执行此操作@ -
另外你声明
myClassDelegateMethod:有一个参数,但performSelector:没有一个......代码是否崩溃,或者它是否注销“Delegate 没有实现 myClassDelegateMethod “? -
@rich 指出,但是如果您查看我的代码(已更新),我也会使用参数
[self.delegate myClassDelegateMethod:self];以这种方式调用它,并且委托中的实现中的日志语句永远不会被记录。没有崩溃。 -
在您创建
Timer实例并设置其delegate属性时显示代码。
标签: objective-c