2012-12-31 36 views
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类不是委托方法之一)?这里是什么,我试图做一个例子:

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

当我尝试使用[[self delegate] methodName];行我碰到下面的错误,以及Xcode中假装喜欢它不知道我在说什么了: enter image description here

这究竟是为什么?为什么我不能告诉代理何时调用委托方法?这可以在委托方法内正常工作,但是为什么不在实现它的类中呢?

思想,观念,链接,教程,代码,或任何形式的帮助将不胜感激。

回答

3

错误说,它不能找到一个方法delegate不在类方法(即,一个与一个+符号表示)的上下文中提供。这可能看起来很混乱,因为类方法中的self不对应于一个实例,而是一个类;另一方面,属性delegate属于一个实例,意味着它不可用。

为了解决这个问题,您应该让checkCloudAvailability一个实例方法,或如下重写:

+(void)checkCloudAvailabilityWithDelegate:(id<iCloudDelegate>)delegate { 
    ... 
} 
+0

在后一种情况下,我认为这将是更容易,如果他只是创建一个类的方法'checkCloudAvailability',将返回的iCloud是否是可用。在这种情况下,授权并不是真正必要的。 –

+0

@Scott我同意 - 我看到使用'delegate'的唯一原因是保持与可以访问'delegate'的内容保持一致。例如,如果多个* instance *方法可能重用这个* class *方法,他们可以共享代码,通过将委托传递给类方法来检查是否实现了'@ optional'方法。 – dasblinkenlight

+0

是的,你是对的,这可能更简单,我同意。我已经在这里使用你的评论来改变我的设计模式,并且它工作得很好。另外请注意,问题中的方法只是一个例子。 –

2

你叫方法+(无效)checkCloudAvailability。 类方法中的“self”表示类对象,而不是实例对象。 但委托为实例对象声明的变量。

-1

当你的函数调用之前使用“+”标注,它成为一个静态方法。在一个静态方法,你不能叫“自我”

+4

你**可以**调用'self',它只是表示一个不同的事物(一个类,而不是一个实例)。我认为这是OP的混乱的最终根源。 – dasblinkenlight

+2

你在混用你的命名法。首先,Objective-C方法与函数不同,在Objective-C中不存在静态方法。带有'+'前缀的方法是类方法,而不是静态方法。 – jlehr

0

看它是一个类的方法。我也将使用属性,而不是一个实例变量:

@property (weak, nonatomic) id<iCloudDelegate> delegate; 
@synthesize delegate = delegate_; 
相关问题