Подкласс наследует делегат суперкласса - PullRequest
0 голосов
/ 05 марта 2020

У меня есть иерархия UIViews. Все они обрабатываются по-разному, но если они вложены, я не могу получить мой setDelegate of super. Я получаю исключение cra sh [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

1 Ответ

1 голос
/ 06 марта 2020

Я тоже не могу сказать, что ты делаешь неправильно. Но ваш пример кода не скомпилируется. (Он полон опечаток.) ​​Я пытался воссоздать то, о чем вы говорите, упрощая его еще больше. (Я использовал 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];
    }
}

Выше не получается sh. Пожалуйста, исправьте ваш пример кода.

...