2

でさまざまなメソッドを使用してカスタム クラスを作成し、カスタム クラスをインポートする別のクラスから呼び出すことができるデリゲート メソッドをそのクラスに追加しました。特に、私は iOS で作業しています。ヘッダー (.h) ファイルと実装 (.m) ファイルの両方の小さなサンプルを次に示します。

//iCloud.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@protocol iCloudDelegate;
@class iCloud;

@interface iCloud : NSObject {
    __weak id<iCloudDelegate> delegate_;
}

@property (nonatomic, weak) id <iCloudDelegate> delegate;

//Methods (abridged for StackOverflow)
+ (void)checkCloudAvailability;

@end

@class iCloud;
@protocol iCloudDelegate <NSObject>
//Methods (abridged for StackOverflow)
@optional
- (void)documentWasSaved;
@required
- (void)iCloudAvailable:(BOOL)status;
@end

そして私の実装の一部(.m):

#import "iCloud.h"
@implementation iCloud
@synthesize delegate;

- (void)documentWasSaved {
    [[self delegate] documentWasSaved];
}

-(void)iCloudAvailable:(BOOL)status {
    [[self delegate] iCloudAvailable:status];
}

+ (void)checkCloudAvailability {
NSLog(@"Checking iCloud availablity...");
NSURL *returnedURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];

if (returnedURL){
    NSLog(@"iCloud is available");
} else {
    NSLog(@"iCloud not available. ☹");
}
}

多数のチュートリアル、SO 投稿、サンプル コードなどを調べて、デリゲート メソッドを呼び出すタイミングをデリゲートに伝える方法を見つけようとしましたが、何も見つけることができませんでした。ほとんどの投稿は、実装が(<DelegateName>構文を使用して)デリゲートを追加する必要があることを示しています、私のカスタムクラスの実装は、デリゲートを使用したい場所ではありません(デリゲートが作成されていない別のクラスにあります)。

上記のサンプル コードでわかるように、デリゲート メソッドを (実装に) 追加しましたが、これでできることは、それを使用する他のクラスでデリゲート メソッドを呼び出すことだけです。これが正しい場合、デリゲートにこれらのメソッドを呼び出すにはどうすればよいですか (たとえばcheckCloudAvailability、デリゲート メソッドの 1 つではないクラスから)。これが私がやろうとしていることの例です:

+ (void)checkCloudAvailability
    if (returnedURL){
      [[self delegate] iCloudAvailable:YES]; 
    ...
}

この行を使用しようとすると[[self delegate] methodName];、次のエラーが発生し、Xcode は私が何を話しているのかわからないように装います。ここに画像の説明を入力

なぜこうなった?デリゲート メソッドを呼び出すタイミングをデリゲート伝えることができないのはなぜですか? これはデリゲート メソッド内では正常に機能しますが、それが実装されているクラスでは機能しないのはなぜでしょうか?

考え、アイデア、リンク、チュートリアル、コード、またはあらゆる種類のヘルプを歓迎します。

4

4 に答える 4

3

このエラーは、クラスメソッドdelegateのコンテキストで使用できないメソッドが見つからないことを示しています(つまり、記号で示されているもの)。クラスメソッド内はインスタンスではなくクラスに対応するため、これは紛らわしく見えるかもしれません。一方、 プロパティはインスタンスに属しており、利用できないことを意味します。+selfdelegate

これに対処するにはcheckCloudAvailability、インスタンス メソッドを作成するか、次のように書き換える必要があります。

+(void)checkCloudAvailabilityWithDelegate:(id<iCloudDelegate>)delegate {
    ...
}
于 2012-12-31T16:03:25.687 に答える
2

クラスメソッド +(void)checkCloudAvailabilityを呼び出します。クラスメソッドの「自己」は、インスタンスオブジェクトではなく、クラスオブジェクトを意味します。ただし、インスタンスオブジェクトに対して宣言されたデリゲート変数。

于 2012-12-31T16:02:58.387 に答える
0

それはクラスメソッドです。インスタンス変数の代わりにプロパティも使用します。

@property (weak, nonatomic) id<iCloudDelegate> delegate;
@synthesize delegate = delegate_;
于 2012-12-31T16:50:01.740 に答える
-1

関数呼び出しの前に「+」アノテーションを使用すると、静的メソッドになります。静的メソッド内では、「self」を呼び出すことはできません

于 2012-12-31T16:04:26.093 に答える