2

クラスでデリゲートを正常にセットアップし、NSObjectいくつかのデータを転送していくつかのセレクターを実行できます。

問題は、デリゲートを設定したクラスに値を戻す方法を理解できないことです。SGDownloaderプロパティを持つViewControllerがあり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 になります。後で何もしませんが。

4

1 に答える 1

0

コードは機能するはずですが、間違った場所を見ています。

isBusyviewDidLoadSGDownloader にセットされますよね?SGQueueControllerattemptNewDownloadのインスタンスを作成します。次に、デリゲートを作成済みの SGDownloader に設定し、それを呼び出しますcheckTheQueue

SGDownloadercheckTheQueueの新しいインスタンスを作成しますが、(デフォルトでは)new呼び出しません。viewDidLoadそのためisBusy、新しく作成された SGDownloader-Instance のプロパティはまだ NO です。[SGDownloader new]- 行を外して変更するだけです

BOOL checkBool = downloaderInstance.isBusy;

BOOL checkBool = delegate.isBusy;

于 2013-04-08T08:35:54.523 に答える