Вызывается ли nsinvocation? - PullRequest
       11

Вызывается ли nsinvocation?

1 голос
/ 10 августа 2011

Я новичок в разработке c и iphone.Я был в замешательстве.Я пытаюсь создать кнопку, которая создается во время выполнения, после нажатия другой кнопки, и приложение не знает об этом:

 -(void)button4Pushed{
    NSLog(@"Button 4 pushed\n");
    Class cls = NSClassFromString(@"UIButton");//if exists {define class},else cls=nil
    id pushButton5 = [[cls alloc] init];

    CGRect rect =CGRectMake(20,220,280,30);
    NSValue *rectValue = [NSValue valueWithCGRect:rect];


    //--------------1st try set frame  - work,but appears at wrong place
    //[pushButton5 performSelector:@selector(setFrame:) withObject:rectValue];
    //--------------2nd try set frame  + this work correctly
    [pushButton5 setFrame: CGRectMake(20,220,280,30)];                    



    //this work correct [pushButton5 performSelector:@selector(setTitle:forState:) withObject:@"5th Button created by 4th" withObject:UIControlStateNormal];
    //but i need to use invocation to pass different parameters:

    NSMethodSignature *msignature;
    NSInvocation *anInvocation;

    msignature = [pushButton5 methodSignatureForSelector:@selector(setTitle:forState:)];
    anInvocation = [NSInvocation invocationWithMethodSignature:msignature];

    [anInvocation setTarget:pushButton5];
    [anInvocation setSelector:@selector(setTitle:forState:)];

    NSNumber* uicsn =[NSNumber numberWithUnsignedInt:UIControlStateNormal];
    NSString *buttonTitle = @"5thbutton";

    [anInvocation setArgument:&buttonTitle atIndex:2];
    [anInvocation setArgument:&uicsn atIndex:3];
    [anInvocation retainArguments];
    [anInvocation invoke];

    [self.view addSubview:(UIButton*)pushButton5];
}

Что я делаю не так?Вызов вызывается, но результата нет ... Я знаю, что могу создать его следующим образом:

    UIButton *pushButton3 = [[UIButton alloc] init];
    [pushButton3 setFrame: CGRectMake(20, 140, 280, 30)];
    [pushButton3 setTitle:@"I'm 3rd button!created by 2nd" forState:UIControlStateNormal];
    [self.view addSubview:pushButton3];

Но мне нужно использовать вызов, и я не знаю, почему он не работает?

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Вы устанавливаете NSNumber * в качестве второго аргумента, но метод, который вы пытаетесь вызвать (эффективно), требует int.Используйте точно такой же код, но вместо этого попробуйте следующие строки:

UIControlState uicsn = UIControlStateNormal;

// затем

[anInvocation setArgument:&uicsn atIndex:3];
1 голос
/ 10 августа 2011

Зачем вам нужен вызов?

Обновление: в зависимости от случая использования, если вы не контролируете другие классы, я бы вместо этого использовал протокол с методом, соответствующим этой сигнатуре, и собирал объекты, для которых этот вызов допустим.

NSInvocation - строительный блок среды выполнения / класс последней инстанции; вы должны использовать другие доступные вам инструменты, такие как протоколы (если у объекта есть метод) и блоки или указатели на функции (если вы просто хотите освободить функцию), если вы вообще можете контролировать окружающие объекты.

Ответ восприятия решает техническую проблему, но, возможно, вы делаете вещи намного сложнее для себя.

...