2011-08-10 7 views
1

私は客観的なCとiphoneの開発でnewbyをしています。私は混乱した。私は別のボタンをクリックした後、実行時に作成されているボタンを作成しようとすると、アプリケーションがそれを知らない:私は間違って何をやっているnsinvocationが呼び出されますか?

-(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

NSNumber *を2番目の引数として設定しますが、呼び出すメソッドにはintが必要です。あなたの正確な同じコードを使用しますが、代わりにこれらの行を試してみてください。そして、

UIControlState uicsn = UIControlStateNormal; 

//

[anInvocation setArgument:&uicsn atIndex:3]; 
+0

あなたは正しいです。どうもありがとう。実際にはNSArrayに渡してNSValueから取得する必要があるため、NSNumberを使用してUIControlStateをラップします。私は2日間過ごしましたが、これをどうやって行うのか分かりません。 – Alexander

+0

@アレクサンダー - 問題なく、今はあなたのために働いてうれしいです。あなたがまだ他の問題を解決したかどうかは分かりませんが、NSInvocationの後には常にUIControlState ***をラップして保存することができます。いずれにしても、幸運を祈り、どんな答えでも受け入れることを忘れないでください。 – Perception

+0

知覚は、UIControlStateをラッピングして機能させる問題を助け、解決されました。あなたはそれについて読むことができます[ここ](http://stackoverflow.com/questions/7036665/nsvaluegetvalue-strange-behavior-why-this-happens) – Alexander

1

なぜ呼び出す必要がありますか?

更新:ユースケースに基づいて、他のクラスを制御しない限り、私はこのシグネチャに一致するメソッドでプロトコルを使用し、これを正当なものとして呼び出すオブジェクトを収集します。

NSInvocationは、実行時ビルディングブロック/ラストリゾートクラスです。プロトコル(オブジェクトにメソッドがある場合)やブロック(ブロックされていない関数が必要な場合)など、他のツールを使用して周囲のオブジェクトを制御することができます。

パーセプションの答えは技術的な問題を解決しますが、あなたはもっと複雑になるかもしれません。

+1

質問を含む答えを投稿しないでください。代わりに質問にコメントを追加してください。 – DarkDust

+0

@DarkDust:アレキサンダーがコメントした後、私は答えを更新するつもりだった。残念ながら私は横行してしまった。 – Jesper

+0

@Jesper:それでも、StackOverflowでは、[回答は回答でなければならない]というルール(エチケット)があります(http://meta.stackexchange.com/questions/17447/answer-or-comment-whats-the-etiquette )。説明のためのあなたの要求(「なぜあなたは呼び出しを使用する必要がありますか?)」とその回答は、回答を提供したいすべての人にとって興味深いので、コメントとして質問に直接添付する必要があります。だから、次回にコメントを投稿してから答えを出してください。ありがとう。 – DarkDust