Могу ли я использовать NSInvocation, чтобы скрыть или показать подкласс UIView без его перерисовки?

Я пытаюсь использовать вызов для обратного вызова 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

person Greg    schedule 07.08.2018    source источник
comment
Возможный дубликат stackoverflow.com/ вопросы/20039600/   -  person matt    schedule 07.08.2018
comment
Мэтт, возможно, но ответ пока не изменил мою проблему. Сейчас я рассматриваю обмен сообщениями, а не вызов, и, в частности, [apeth.com/ iOSBook/ch03.html#_messages_as_data_type]   -  person Greg    schedule 07.08.2018
comment
Ну, я не понимаю, как это поможет. :)   -  person matt    schedule 07.08.2018