gpt4 book ai didi

objective-c - 如何使 super 成为 NSTimer 的目标?

转载 作者:行者123 更新时间:2023-11-28 17:58:10 24 4
gpt4 key购买 nike

我正在尝试使用 NSTimer 来调用类的父类(super class)中的函数。

如果我这样调用它,这个函数就可以工作:

[super playNarrationForPage:[NSNumber numberWithInt:1]];

但是如果我这样做:

NSTimer *narrationTimer = [NSTimer scheduledTimerWithTimeInterval:7.5
target:self.superclass
selector:@selector(playNarrationForPage:)
userInfo:[NSNumber numberWithInt:1]
repeats:NO
];

我收到此错误:无法识别的选择器已发送至类 0x106890
2012-07-06 21:14:59.522 MyApp[19955:707] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+[MyBaseClass playNarrationForPage:]: 无法识别的选择器发送到类 0x106890”

我已经尝试将 super 设置为 target: 但我被告知“使用未声明的标识符 super”。有什么想法吗?

最佳答案

既然 self.superclass 返回的是一个 Class 对象,那肯定不是你想要的。

此外,您似乎不了解 NSTimer 是如何调用其目标的。您正在使用 NSNumber 作为计时器的 userInfo,并且您的 playNarrationForPage: 方法似乎需要一个 NSNumber 参数.但是 NSTimer 在调用其目标时不会将其 userInfo 作为参数传递! NSTimer自身 作为参数传递,如下所示:

// self is the NSTimer object here!
[self.target performSelector:self.selector withObject:self];

必须创建一个新方法供您的计时器调用。这个新方法需要将定时器作为它的参数,像这样:

- (void)narrationTimerDidFire:(NSTimer *)timer {
[self playNarrationForPage:timer.userInfo];
}

然后您需要在创建计时器时使用该选择器:

NSTimer *narrationTimer = [NSTimer scheduledTimerWithTimeInterval:7.5
target:self
selector:@selector(narrationTimerDidFire:)
userInfo:[NSNumber numberWithInt:1]
repeats:NO];

如果你真的想让narrationTimerDidFire:调用[super playNarrationForPage:],编译器会让你。但这样做非常可疑。如果您没有在子类中覆盖 playNarrationForPage:,那么就没有理由直接引用 super;您的子类继承其父类(super class)的 playNarrationForPage: 方法。如果您在您的子类中覆盖了 playNarrationForPage:,那么从您的计时器回调中绕过它表明您的设计存在问题。

关于objective-c - 如何使 super 成为 NSTimer 的目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11369176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com