Как установить аргументы в 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

0 ответов

Другие вопросы по тегам