我已经创造了在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
类不是委托方法之一)?这里是什么,我试图做一个例子:
+ (void)checkCloudAvailability
if (returnedURL){
[[self delegate] iCloudAvailable:YES];
...
}
当我尝试使用[[self delegate] methodName];
行我碰到下面的错误,以及Xcode中假装喜欢它不知道我在说什么了:
这究竟是为什么?为什么我不能告诉代理何时调用委托方法?这可以在委托方法内正常工作,但是为什么不在实现它的类中呢?
思想,观念,链接,教程,代码,或任何形式的帮助将不胜感激。
在后一种情况下,我认为这将是更容易,如果他只是创建一个类的方法'checkCloudAvailability',将返回的iCloud是否是可用。在这种情况下,授权并不是真正必要的。 –
@Scott我同意 - 我看到使用'delegate'的唯一原因是保持与可以访问'delegate'的内容保持一致。例如,如果多个* instance *方法可能重用这个* class *方法,他们可以共享代码,通过将委托传递给类方法来检查是否实现了'@ optional'方法。 – dasblinkenlight
是的,你是对的,这可能更简单,我同意。我已经在这里使用你的评论来改变我的设计模式,并且它工作得很好。另外请注意,问题中的方法只是一个例子。 –