Как установить аргументы в NSInvocation
Я пытаюсь понять, как использовать NSInvocation
перезвонить и переключить hidden
собственностью UIView.
В отличие от моей предыдущей попытки сообщение отправляется методу в UIViewController.
Для тестирования invokerMethod
называется когда UIButton
нажата. Эта версия больше не падает (т.е. журнал консоли моей предыдущей попытки пропал), но поочередно не показывает и не скрывает красный квадрат.
methodSignatureForSelector:
кажется правильным, но что-то не так с синтаксисом setTarget:
или же setSelector:
или же setArgument:
но я не могу сказать, какой. Или есть другая причина?
Обновить
Цель, которую я хочу достичь, состоит в том, чтобы изменить свойства внутри UIView
после того, как это было инициализировано. Это позволит мне улучшить ранний проект, где весь UIView
- и все его кнопки, метки, изображения и т. д. - перерисовывается каждый раз, когда кнопка или метка изменяет состояние. Я жду NSInvocation
позволит мне сделать это, но я открыт для самого простого подхода.
Код в этом посте основан на этих ответах ( ответ 1 и ответ 2).
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic, weak) UIView* square;
@end
ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view addSubview:[self square:CGRectMake(120, 120, 100, 100)]]; // draw once only
[self.view addSubview:[self button:CGRectMake(120, 230, 100, 50)]];
SEL sel = @selector(invokerMethod:andBOOL:andStr:);
int i = 10;
BOOL bol = YES;
NSString *str = @"hey Yunas !";
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:sel]];
[inv setSelector:sel];
[inv setTarget:_square];
[inv setArgument:&i atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv setArgument:&bol atIndex:3];
[inv setArgument:&str atIndex:4];
[inv invoke];
NSLog(@"%d, %i, %@", i, bol, str);
}
Вот метод, который поочередно скрывает или показывает...
- (UIView *)square:(CGRect)frame
{
UIView *_square = [[UIView alloc] initWithFrame:frame];
_square.backgroundColor = [UIColor redColor];
// _square.hidden = NO;
return _square;
}
... и вот метод кнопки...
- (UIButton *)button:(CGRect)box
{
UIButton *tap = [[UIButton alloc] initWithFrame:box];
tap.backgroundColor = [UIColor lightGrayColor];
[tap setTitle:@"toggle" forState:UIControlStateNormal];
[tap addTarget:self action:@selector(myToggleTest:) forControlEvents:UIControlEventTouchUpInside]; //
return tap;
}
- (void)myToggleTest:(UIButton *)sender
{
int number = 5;
BOOL bol = NO;
NSString* str = @"hey Barry !";
if (_square)
{
if (_square.hidden)
{
bol = NO;
[_square setHidden:NO];
}
else
{
bol = YES;
[_square setHidden:YES];
}
[self invokerMethod:(int)number andBOOL: (BOOL)bol andStr: (NSString*)str];
}
}
... и вот метод invoker...
- (void)invokerMethod:(int)number andBOOL:(BOOL)bol andStr:(NSString *)str
{
NSLog(@"%d %i %@", number, bol, str);
}
@end