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 假装它不知道我在说什么了:在此处输入图像描述

为什么会这样?为什么我不能告诉委托何时调用委托方法?这在委托方法内部工作得很好,但为什么不能在实现它的类中呢?

任何形式的想法、想法、链接、教程、代码或帮助将不胜感激。

4

4 回答 4

3

该错误表示它找不到在类方法delegate的上下文中不可用的方法(即用符号表示的方法)。这可能看起来令人困惑,因为类方法内部不对应于实例,而是对应于类;另一方面,该属性属于一个实例,这意味着它不可用。+selfdelegate

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

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

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

于 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 回答