Objective-Cでさまざまなメソッドを使用してカスタム クラスを作成し、カスタム クラスをインポートする別のクラスから呼び出すことができるデリゲート メソッドをそのクラスに追加しました。特に、私は 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 は私が何を話しているのかわからないように装います。
なぜこうなった?デリゲート メソッドを呼び出すタイミングをデリゲートに伝えることができないのはなぜですか? これはデリゲート メソッド内では正常に機能しますが、それが実装されているクラスでは機能しないのはなぜでしょうか?
考え、アイデア、リンク、チュートリアル、コード、またはあらゆる種類のヘルプを歓迎します。