首页 > 解决方案 > 子类继承超类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

标签: objective-cinheritancedelegatessubclassing

解决方案


我也说不出你做错了什么。但是,您的示例代码将无法编译。(它充满了错别字。)我试图重新创建你在说什么,进一步简化它。(我使用了 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];
    }
}

以上不会崩溃。请修复您的示例代码。


推荐阅读