Я пытаюсь использовать вызов для обратного вызова UIView
в Objective C и переключения его свойства hidden
. Сообщение должно быть отправлено в пользовательское представление в выделенном классе SquareView
.
В демонстрационных целях мой invokerMethod
будет вызываться из UIButton.
Подходящее место для этого и свойство SquareView
, похоже, будет UIViewController.
Но я не могу сказать, предназначен ли вызов для возврата значения, и мой пример кода дает следующую ошибку
+[NSInvocation _invocationWithMethodSignature:frame:]: аргумент подписи метода не может быть равен нулю
Может кто-нибудь указать, что я ошибся. Примеры NSInvocation
я просмотрел здесь здесь и здесь до сих пор не пролили свет на это. И эта ссылка не работает.
РЕДАКТИРОВАТЬ
Это может быть повторяющимся вопросом, но ответ не решил мою проблему. Но я нашел еще один вопрос при вызове с ответами, которые помогли создать более простая версия того, что я пытаюсь сделать, с несколько иной проблемой, связанной с той, что здесь, в этом посте.
Вот мой код до сих пор
ViewController.h
#import <UIKit/UIKit.h>
#import "SquareView.h"
@interface ViewController : UIViewController
@property (nonatomic, weak) UIView* square;
@end
ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
SquareView *square = [[SquareView alloc] initWithFrame:CGRectMake(60, 60, 100, 100)];
[self.view addSubview:square]; // draw once only
[self.view addSubview:[self button:CGRectMake(120, 230, 100, 50)]];
SEL selector = @selector(invokerMethod:);
BOOL toggle;
UIView *target = _square;
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:selector]];
invocation.selector = selector;
invocation.target = target;
[invocation setArgument:&toggle atIndex:2];
[invocation invoke];
__weak id returnValue = nil;
[invocation getReturnValue:&returnValue];
}
Вот метод вызывающего…
- (id)invokerMethod:(NSInteger)tag
{
NSLog(@"toggle view each time”);
if (_square)
{
if (_square.hidden)
{
[_square setHidden:NO];
}
else
{
[_square setHidden:YES];
}
}
return nil;
}
… а вот метод кнопки…
- (UIButton *)button:(CGRect)box
{
UIButton *tap = [[UIButton alloc] initWithFrame:box];
tap.backgroundColor = [UIColor lightGrayColor];
[tap setTitle:@“toggle" forState:UIControlStateNormal];
[tap addTarget:self action:@selector(invokerMethod) forControlEvents:UIControlEventTouchUpInside];
return tap;
}
… и вот вид, который переключается.
SquareView.h
#import <UIKit/UIKit.h>
@interface SquareView : UIView
@end
SquareView.m
#import "SquareView.h"
@implementation SquareView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
UIView *square = [[UIView alloc] initWithFrame:frame];
square.backgroundColor = [UIColor redColor];
[self addSubview:square];
}
return self;
}
@end