【问题标题】:implemented delegate method but told it's not implemented实现了委托方法,但告诉它没有实现
【发布时间】: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


【解决方案1】:

您的timer 方法有问题。应该是:

-(Timer *)timer
{
    if (!_timer) {
        _timer = [[Timer alloc] init];
    }

    return _timer;
}

正如您所拥有的那样,每次您执行self.timer 时,您都在创建一个新计时器,因此委托仅应用于众多实例之一。

【讨论】:

  • 您必须确保timer 属性也被声明为strong
  • 好的,谢谢,实际上我为每个实例创建一个新计时器是有原因的(即我正在创建多个计时器),所以我改为在这个工厂方法中设置委托@987654326 @ 现在工作正常。
  • 当你输入答案的那一刻,只是看到@rmaddy's pop up for win。
  • @Rich - 是的,它需要强大。
  • @Rich 我做了,但不知道为什么这很重要(如果你能解释的话)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2021-12-28
相关资源
最近更新 更多