Могу ли я использовать NSInvocation, чтобы скрыть или показать подкласс UIView, не перерисовывая его?
Я пытаюсь использовать вызов для обратного вызова UIView
в цель C и переключить его hidden
имущество. Сообщение должно быть отправлено в пользовательское представление в выделенном классе SquareView
,
В демонстрационных целях мой invokerMethod
будет вызван из UIButton.
Подходящее место для этого и SquareView
Казалось бы, собственность UIViewController.
Но я не могу сказать, предназначен ли вызов для возврата значения, и мой пример кода дает следующую ошибку
+[NSInvocation _invocationWithMethodSignature:frame:]: аргумент подписи метода не может быть nil'
Может кто-нибудь, пожалуйста, указать, что я ошибся. Примеры 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];
}
Вот метод invoker...
- (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