在Objective-C中通知自定义委托类

时间:2012-12-19 12:29:01

标签: iphone objective-c ios cocoa-touch

我已成功在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。虽然以后什么都没做。

1 个答案:

答案 0 :(得分:0)

你的守则应该有效,但你看错了地方。

isBusy设置在SGDownloader的viewDidLoad中,对吗?在attemptNewDownload中,您将创建一个SGQueueController实例。然后将其Delegate设置为已创建的SGDownloader并在其上调用checkTheQueue

checkTheQueue中,您创建了一个新的SGDownloader实例,但new未调用viewDidLoad(默认情况下)。所以新创建的SGDownloader-Instance的isBusy - 属性仍为NO。只需放出[SGDownloader new] - 行并更改

即可

BOOL checkBool = downloaderInstance.isBusy;

BOOL checkBool = delegate.isBusy;