Изменение определения NSObject, приводящее к нераспознанному селектору

#ios #objective-c #swift #nsobject

#iOS #objective-c #swift #nsobject

Вопрос:

Я пытаюсь настроить NSObject , чтобы принять дополнительный параметр, однако всякий раз, когда я пытаюсь добавить это, я получаю:

 NSInvalidArgumentException: -[TEATimeRange initWithStart:end:fill:]: unrecognized selector sent to instance`
  

Вот .h файл:

 #import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface TEATimeRange : NSObject

@property (nonatomic) NSDate *start;
@property (nonatomic) NSDate *end;
@property (nonatomic) IBInspectable UIColor *fill;

  (instancetype)timeRangeWithStart:(NSDate *)startTime end:(NSDate *)endTime fill:(UIColor *)fillColor;

- (id)initWithStart:(NSDate *)startTime end:(NSDate *)endTime fill:(UIColor *)fillColor;

@end
  

и .m файл:

 #import "TEATimeRange.h"

@implementation TEATimeRange

  (instancetype)timeRangeWithStart:(NSDate *)startTime end:(NSDate *)endTime fill:(UIColor *)fillColor
{
    return [[TEATimeRange alloc] initWithStart:startTime end:endTime fill:fillColor];
}

- (id)initWithStart:(NSDate *)startTime end:(NSDate *)endTime fill:(UIColor *)fillColor
{
    self = [super init];
    if (self) {
        _start = startTime;
        _end = endTime;
        _fill = fillColor;
    }
    return self;
}

@end
  

Вызывающий экземпляр (в Swift):

 TEATimeRange(start: someDateTime, end: someDateTime?.addingTimeInterval(TimeInterval(someTime)), fill: .orange)
  

Если я удалю ссылки на fill: него, он будет работать как ожидалось, поэтому я не понимаю, почему.

Я попытался выполнить поиск SO, но, поскольку у меня всего 3 дня опыта разработки iOS, я не смог найти никакого решения, поэтому буду признателен за любую помощь. (Даже если это глупо!)

Комментарии:

1. Ваш код компилируется, но вы получаете эту ошибку во время выполнения? Это не должно помочь, но изменится id на instancetype для вашего init... метода. Кроме того, покажите код, который создает TEATimeRange экземпляр.

2. Я только что добавил ваш класс точно как есть в тестовый проект iOS. Строка, такая как TEATimeRange *range = [TEATimeRange timeRangeWithStart:[NSDate date] end:[NSDate date] fill:[UIColor redColor]]; построенная и запущенная без ошибок.

3. @rmaddy Я обновил свой вопрос соответствующим экземпляром creation, обратите внимание, что вызывающий объект находится в swift против objc

4. Вы уверены, что ваш обновленный .m файл включен в ваше целевое приложение и повторно скомпилирован?

5. @OOPer Я очистил свою папку сборки и перестроил ее. Это то, что вы имеете в виду? И да, TEAChart родительский элемент импортируется в файл целевого приложения UIViewController

Ответ №1:

Для будущих разработчиков, которые попали на эту страницу, моя проблема была решена следующим образом:

  1. Очистить папку сборки (Продукт> Очистить папку сборки или K)
  2. Перезапуск Xcode
  3. Повторный запуск приложения

См. Комментарии выше от @OOPer и @rmaddy для получения дальнейших указаний, если это не сработает

Комментарии:

1. Это работает, потому что добавленное вами свойство является объектом Interface Builder (IB), и в большинстве случаев необходимо очистить папку сборки, попробуйте добавить новое свойство, такое как NSString или NSInteger, молодец и играй с кодом 🙂 приветствия