Частное API iOS выполнить аварийное завершение выборки
По сути, я хочу получить список целей для UIButton. Я прошел через это, и мой вопрос немного отличается, потому что я не знаю, какова цель. Все, что у меня есть, это объект UIButton. Итак, вот что я сделал, чтобы захватить все цели действий.
Вдохновленный методом ниже, который работает, где я получаю объект firstResponder в качестве действительного указателя.
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
UIView *firstResponder = [keyWindow performSelector:@selector(firstResponder)];
Я использовал class-dump на UIKit, чтобы увидеть класс UIWindow, и я нашел firstResponder, как показано ниже.
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIWindow : UIView {
@package
UIResponder *_firstResponder;
}
Затем я проверил UIControl, который через класс-дамп как
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIControl : UIView {
@package
NSMutableArray* _targetActions;
}
Итак, вот что я пытаюсь сделать, и это вылетает.
NSMutableArray *arr = (NSMutableArray*)[((UIControl*)btn) performSelector:@selector(targetActions)];
NSLog(@"%@",arr);
Звучит как заговор против меня. Но, скорее всего, я кое-что обманываю. Кто-нибудь знает, как получить доступ к массиву targetActions из UIControl?
РЕДАКТИРОВАТЬ: Вот сообщение об ошибке -
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '- [UIRoundedRectButton targetActions]: unrecognized selector sent to instance 0x1c0ab0'
Любая помощь приветствуется.
1 ответ
Согласно документации UIControl, сообщение, которое нужно отправить для получения списка целей, это allTargets, а не targetActions, как вы предлагаете. Остальная часть решения находится в принятом ответе на Как получить события UIButton Target, Action и Control?
Техника отладки, которую вы можете использовать, когда вы не знаете, что делаете, - это использовать responsedsToSelector, чтобы проверить, отправляете ли вы сообщение, на которое может ответить объект: когда использовать responsedsToSelector в target-c