Objective-C Категория Причинение непризнанного селектора
В моем проекте есть функция категории UIImage
, которую я хочу вызвать из другого класса. Я правильно импортирую заголовочный файл для категории изображения, и я хочу, чтобы проект компилировался без предупреждения.
Проблема заключается в том, что когда я вызываю функцию категории UIImage
, я видел непризнанную ошибку селектора с помощью NSInvalidArgumentException
. Почему я вижу это, если я правильно связал все?
#import <UIKit/UIKit.h>
@interface UIImage (DRShare)
+ (UIImage*) imageNamed:(NSString*)name;
@end
@implementation UIImage (DRShare)
+ (UIImage*) imageNamedDR:(NSString*)name{
CGFloat s = 1.0f;
if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){
s = [[UIScreen mainScreen] scale];
}
NSString *path = [NSString stringWithFormat:@"%@%@%@.png",kImagesPath,name,s > 1 ? @"@2x":@""];
return [UIImage imageWithContentsOfFile:DRBUNDLE(path)];
}
@end
который вызывает его:
backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamedDR:@"Share Popup Background"]];
исключение:
2010-10-22 11:51:02.880 Stuff[11432:207] +[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938
2010-10-22 11:51:02.883 Stuff[11432:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938'
*** Call stack at first throw:
(
0 CoreFoundation 0x02e65b99 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x02fb540e objc_exception_throw + 47
2 CoreFoundation 0x02e6776b +[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x02dd72b6 ___forwarding___ + 966
4 CoreFoundation 0x02dd6e72 _CF_forwarding_prep_0 + 50
5 TapTapShare 0x0001291c -[DRShareViewController backgroundView] + 127
6 TapTapShare 0x00012343 -[DRShareViewController loadView] + 639
7 UIKit 0x0044f54f -[UIViewController view] + 56
8 UIKit 0x0044d9f4 -[UIViewController contentScrollView] + 42
9 UIKit 0x0045d7e2 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48
10 UIKit 0x0045bea3 -[UINavigationController _layoutViewController:] + 43
11 UIKit 0x0045d12d -[UINavigationController _startTransition:fromViewController:toViewController:] + 524
12 UIKit 0x00457ccd -[UINavigationController _startDeferredTransitionIfNeeded] + 266
13 UIKit 0x00574b55 -[UILayoutContainerView layoutSubviews] + 226
14 QuartzCore 0x02616481 -[CALayer layoutSublayers] + 177
15 QuartzCore 0x026161b1 CALayerLayoutIfNeeded + 220
16 QuartzCore 0x026160bd -[CALayer layoutIfNeeded] + 111
Ответы
Ответ 1
Пара возможностей:
- Вы не указали
UIImage+TTShare.m
в свою цель. Поэтому, когда у вас есть заголовок, вы не компилируете реализацию.
- Если это часть статической библиотеки, вам нужно добавить
-all_load
в параметр Другие компоновщики флагов для приложения, связанного с библиотекой.
Ответ 2
Если вы хотите использовать метод Category, вы должны добавить -ObjC в настройку сборки других компоновщиков флагов вашего APP.
Ответ 3
У меня была такая же проблема, и мне пришлось применить это исправление.
Мой исходный файл NSDate-Extensions.m не компилировался, поэтому мне нужно было войти в "Настройки проекта", затем выбрать подходящую цель, затем щелкнуть вкладку "Сборка фаз", затем развернуть элементы "Компиляция источников", а затем нажать символ + и вручную добавьте файл NSDate-Extensions.m.
Ответ 4
У меня возникло это сообщение об ошибке, и я использую Cocoapods. Чтобы исправить ошибку, мне просто нужно было вызвать pod install
снова, чтобы правильно создать все необходимые ссылки.
Ответ 5
Другая возможность.
У вас есть реализация категории, но у вас нет интерфейса.
Я имею в виду, что вы забыли объявить в *.h интерфейс вашей категории.
Ответ 6
Еще одна возможность:
Это почти слишком неловко, чтобы признаться, но на всякий случай кто-то мог сделать ту же глупую ошибку:
Я копировал код из одного проекта в другой, и по ошибке я вставил тот же исходный код в файле .h
и в файле .m
(в обоих я поставил код, предназначенный для файла .h
). Я исправил файл .m
, и он сработал.
Ответ 7
Может быть, потому, что вы пишете imageNamed
вместо imageNamedDR
в интерфейсе.