【问题标题】:Subclass inherit Superclass Delegate子类继承超类Delegate
【发布时间】:2020-03-04 23:24:50
【问题描述】:

我有一个 UIView 的层次结构。它们的处理方式都不同,但如果嵌套,我无法让我的 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-c inheritance delegates subclassing


    【解决方案1】:

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

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

    【讨论】:

    • 我输入得很快,因为我的实际代码会令人困惑,但最终它显示了我试图完成的工作的基础。在您提供的子类中 [super doSomething];这就是我所缺少的。感谢您的澄清,这当然是正确的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多