objective-c - 告诉自定义委托(delegate)何时调用方法

标签 objective-c ios class delegates

我在 中创建了一个具有各种方法的自定义类我还向该类添加了委托(delegate)方法,可以从导入我的自定义类的另一个类调用该委托(delegate)方法。特别是我正在使用 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 帖子、示例代码等,试图找出如何告诉委托(delegate)何时调用委托(delegate)方法,但我一直无法找到任何东西。大多数帖子显示实现应该添加委托(delegate)(使用 <DelegateName> 语法),但是我的自定义类实现不是我想要使用委托(delegate)的地方(它在委托(delegate)不存在的另一个类中)正在创建)。

正如您在上面的示例代码中看到的,我已经添加了委托(delegate)方法(在实现中),但据我所知,这一切都会调用其他使用它的类中的委托(delegate)方法。如果这是正确的,那么我如何让委托(delegate)调用这些方法(比如从我的 checkCloudAvailability 类中调用,它不是委托(delegate)方法之一)?这是我正在尝试做的事情的示例:

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

当我尝试使用[[self delegate] methodName];时我收到以下错误,Xcode 假装它不知道我在说什么了:enter image description here

为什么会发生这种情况?为什么我不能告诉委托(delegate)何时调用委托(delegate)方法?这在委托(delegate)方法内部工作得很好,但为什么在实现它的类中不行呢?

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

最佳答案

错误表明它找不到方法委托(delegate)类方法的上下文中不可用(即用+表示的方法) > 标志)。这可能看起来很困惑,因为类方法中的 self 并不对应于实例,而是对应于类;另一方面,属性delegate属于一个实例,这意味着它不可用。

要解决此问题,您应该将 checkCloudAvailability 设为实例方法,或按如下方式重写:

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

关于objective-c - 告诉自定义委托(delegate)何时调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14103578/

相关文章:

ios - 无法将消息从 inappbrowser 发布到 Cordova 应用程序

ios - 与数组一起使用的字典键值

ios - 将用户发送到 iOS9 应用商店进行更新

c# - 必须声明一个主体,因为它没有标记为 abstract、extern 或 partial

iphone - 如何在 iPhone 上显示音频表

ios - 从函数返回 CGAffineTransform

iphone - 适用于 iOS 5 和 iOS 6 的 Facebook 集成

c - 非类类型错误

javascript - 在 "inherit"中,我在使用 'return' 代码时遇到问题

ios - 使用2个表ios创建数据库