Могу ли я использовать 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

0 ответов

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