我已经在NSObject
类中成功设置了一个委托,并且能够传输一些数据并运行一些选择器。
问题是,我不明白如何将一些值发送回设置委托的那个类。我有一个ViewController,SGDownloader
具有BOOL
属性,我想在委托类上检查它,以有条件地触发某些选择器。问题是,我似乎无法使其正常运行。我正在使用情节提要,这是我的代码:
-(void)checkTheQueue {
SGDownloader *downloaderInstance = [SGDownloader new];
NSLog((@"Downloader is now %i"), downloaderInstance.isBusy);
BOOL checkBool = downloaderInstance.isBusy;
if (checkBool == NO) {
SEL selector = @selector(checkTheThing);
if (delegate && [delegate respondsToSelector:selector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[delegate performSelector:selector];
#pragma clang diagnostic pop
}
}
else {
NSLog(@"Sorry, I'm busy");
}
}
我在第一个类中触发选择器
checkTheThing
,该类是我想从中获取isBusy
值的类。这也是@optional
委托方法。事实是,
BOOL
的值始终为0,如果我尝试传递字符串,则始终为nil
。我怀疑这行有问题-
SGDownloader *downloaderInstance = [SGDownloader new];
也许情节提要混在一起或类似的东西。编辑:
来自
SGDownloader
的部分代码:- (IBAction)attemptNewDownload:(id)sender {
SGQueueController *myProtocol = [SGQueueController new];
myProtocol.delegate = self;
NSLog((@"Busy value equals %i while checking the protocol"), isBusy);
[myProtocol checkTheQueue];
}
在这里
NSLog
告诉我该值是1。几秒钟后,在我的协议类上它是0。尽管以后没有任何处理。 最佳答案
您的代码应该可以工作,但是您在寻找错误的地方。
在SGDownloader的isBusy
中设置了viewDidLoad
,对吗?在attemptNewDownload
中,您将创建SGQueueController的实例。然后,将其Delegate设置为已创建的SGDownloader,并在其上调用checkTheQueue
。
在checkTheQueue
中,您将创建一个新的SGDownloader实例,但是new
不会调用viewDidLoad
(默认情况下)。因此,新创建的SGDownloader-Instance的isBusy
-property仍然为NO。只需释放[SGDownloader new]
-line并进行更改BOOL checkBool = downloaderInstance.isBusy;
至BOOL checkBool = delegate.isBusy;
关于iphone - 在Objective-C中通知自定义委托(delegate)类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13952502/