我已经在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/

10-11 17:15