【发布时间】:2018-12-06 22:57:17
【问题描述】:
我想提供在我的委托方法中调用的几个视图控制器中使用的方法。
例如,我有一些 CloudKit 功能(我已将其添加到我自己的框架中,但我认为这并不重要),我想在其中提供一些崩溃日志记录。 以前我在每个视图控制器中都有一个 crashLog 函数,效果很好,但是我有很多重复的代码。
因此,我想用这些方法生成一个类别。
但是我很难让我的委托方法看到这些类别方法。
这是我的代码..
UIViewController+CloudKitDelegates.h
@interface UIViewController (CloudKitDelegates) <iCloudDBDelegate>
@property (weak,nonatomic) id<iCloudDBDelegate>iCloudDBDelegate;
-(void)crashLog:(NSString*)message, ...;
@end
UIViewController+CloudKitDelegates.m
#import "UIViewController+CloudKitDelegates.h"
@implementation UIViewController (CloudKitDelegates)
@dynamic iCloudDBDelegate;
-(void)crashLog:(NSString*)message, ...
{
va_list args;
va_start(args, message);
NSLog(@"%@", [[NSString alloc] initWithFormat:message arguments:args]);
va_end(args);
}
@end
h 文件 - 我的调用视图控制器(例如我的视图控制器)
#import "UIViewController+CloudKitDelegates.h"
m 文件 - 委托方法
-(NSString*)getDBPath
{
[self.iCloudDBDelegate crashLog: @"testing"];
从这个电话我收到一个错误...
'NSInvalidArgumentException', reason: '-[MyViewController crashLog:]:
unrecognized selector sent to instance
错误显示我的调用视图控制器 MyViewController 没有 crashLog 方法,我在我的类别中有该方法。
任何想法我哪里出错了?
【问题讨论】:
-
类别是否在框架中?这是此类问题的常见原因。或者,您是否确保
UIViewController+CloudKitDelegates.m实际上正在编译并包含在项目中(另一个常见错误)。 -
iCloudDBDelegate是如何实例化的?UIViewController和iCloudDBDelegate是否都符合iCloudDBDelegate?Startup是否符合iCloudDBDelegate? -
哪个对象是代理,
iCloudDBDelegate或视图控制器?哪个对象应该执行crashLog:? -
见@RobNapier 的评论——你说你的代码在一个框架中,他说把代码放在一个框架中经常会导致这些问题。因此,请考虑将您的类别从框架中移出并进入您的应用程序以供初学者使用。
-
另外:我看到 delegate 这个词在这里被抛出了很多,但我没有看到实际的委托对象。人们一直在滥用 delegate,这似乎使问题变得模糊不清。委派是您问题的一个重要方面吗?
标签: objective-c cocoa-touch delegates objective-c-category