objective-c - 子类继承超类Delegate
问题描述
我有 UIViews 的层次结构。它们的处理方式都不同,但如果嵌套,我无法让我的 setDelegate 触发。我收到一个崩溃异常 [ThirdClass setDelegate:] 无法识别的选择器发送到实例。无论我使用什么(子类)SecondClass 或 ThirdClass,这实际上都会发生,但是如果我使用(FirstClass),一切都会正常工作,但是委托的任何子类化都无法识别调用。我已经简化了我在下面做的事情,如果我在 MainControlInterface 中单独调用我的第一个类,一切都会正常工作。我确定我在这里做错了什么,但无法确定那是什么,如果有人能提供帮助,将不胜感激,谢谢。
@protocol FirstClassDataSource, FirstClassDelegate;
@interface FirstClass : UIView
@property (nonatomic, weak_delegate) __nullable id<FirstClassDataSource> dataSource;
@property (nonatomic, weak_delegate) __nullable id<FistClassDelegate> delegate;
@end
@protocol FirstClassDataSource <NSObject>
- (NSInteger)doSomething:(FirstClass *)class;
@optional
- (NSInteger)doSomethingElse:(FirstClass *)class;
@end
@protocol FirstClassDelegate <NSObject>
@optional
- (void)handleMoreDelegateMethods:(FirstClass *)class;
@end
@implementation FirstClass
- (void)setDataSource:(id< FirstClassDataSource >)dataSource
{
if (_dataSource != dataSource)
{
_dataSource = dataSource;
if (_dataSource)
{
[self reloadData];
}
}
}
- (void)setDelegate:(id< FirstClassDelegate>)delegate
{
if (_delegate != delegate)
{
_delegate = delegate;
if (_delegate && _dataSource)
{
[self setNeedsLayout];
}
}
}
@end
@interface SecondClass : FirstClass
-(id)sencondClassesPrivateMethods;
@end
@interface ThirdClass : secondClass
-(id)thirdClassPrivateMethods;
@end
@interface MainControlInterface : UIView <FirstClassDataSource, FirstClassDelegate>
-(ThirdClass *)thirdClass;
@end
@implementation MainControlInterface
-(void)didMoveToSuperview{
ThirdClass *mythirdSubClass = [self thirdClass];
mythirdSubClass.delegate = self;
mythirdSubClass.dataSource = self;
}
@end
解决方案
我也说不出你做错了什么。但是,您的示例代码将无法编译。(它充满了错别字。)我试图重新创建你在说什么,进一步简化它。(我使用了 CodeRunner,这是一个 macOS 应用程序,它可以促进这类事情。)
#import <Foundation/Foundation.h>
@protocol FirstClassHandling <NSObject>
- (void)doTheThing;
@end
@interface FirstClass : NSObject
@property (nonatomic, weak) id<FirstClassHandling> delegate;
- (void)doSomething;
@end
@implementation FirstClass
- (void)doSomething
{
NSLog(@"First class.");
if ([[self delegate] respondsToSelector:@selector(doTheThing)]) {
[[self delegate] doTheThing];
}
}
@end
@interface SecondClass : FirstClass
@end
@implementation SecondClass
- (void)doSomething
{
NSLog(@"Second class");
[super doSomething];
}
@end
@interface Handler : NSObject <FirstClassHandling>
@end
@implementation Handler
- (void)doTheThing
{
NSLog(@"Doing my thing!!!");
}
@end
int main(int argc, char *argv[])
{
@autoreleasepool {
Handler* handler = [[Handler alloc] init];
SecondClass* sc = [[SecondClass alloc] init];
sc.delegate = handler;
[sc doSomething];
}
}
以上不会崩溃。请修复您的示例代码。
推荐阅读
- mongodb - 如何使用mongodb在数组中投影字段
- go - 使用 goroutine 处理退避
- ios - ios通用重定向链接不适用于真实设备,但适用于模拟器
- javascript - 单选按钮文本区域和 Javascript
- r - 在我的闪亮中插入 bs_embed_popover 函数
- discord.js - 如何确定发送消息的时间
- java - 从控制器返回pdf并在春季显示在前端
- python - 我们可以将行和列> 1的数据框复制到Excel工作表中吗?
- ssms - SSMS 18 '<' 附近的语法不正确,需要 ID 或 QUOTED_ID
- python - 替换子字符串但跳过以前的出现