0

1 ページにボタンのグリッドがあります。ボタンをクリックすると別のビューに移動したい。ビューを変更するには、次のアクションに何を追加すればよいですか?

-(void)buttonPressed:(UIButton *)button {
    NSLog(@"button %u -- frame: %@", button.tag, NSStringFromCGRect(button.frame));
}

ボタンのグリッドは次のように作成されます。

{
    int rows = 13, columns = 4;
    UIView *buttonView = [[UIView alloc] initWithFrame:CGRectMake(0.f, 0.f, 80*columns, 32*rows)];
    int currentTag = 0;

    for (int y = 0; y < rows; y++) {
        for (int x = 0; x < columns; x++) {

            UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom]; 
            //  [button.layer setBorderWidth:1.0]; 
            //  [button.layer setBorderColor:UIColor blackColor]];
            button.backgroundColor=[UIColor colorWithRed: 201.0/255.0 green: 201.0/255.0 blue:201.0/255.0 alpha: 1.0];
            button.tag = currentTag;
            currentTag++;
            [button.layer setBorderColor: [[UIColor blackColor] CGColor]];
            [button.layer setBorderWidth: 1.0];
            [button setTitle:[NSString stringWithFormat:@"%d",currentTag] forState:UIControlStateNormal];
            button.frame = CGRectMake(80*x, 32*y, 80, 32); 
            [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
            [buttonView addSubview: button];

        }
    }

    // Center the view which contains your buttons
    CGPoint centerPoint = buttonView.center;
    centerPoint.x = self.view.center.x;
    buttonView.center = centerPoint;
    [self.view addSubview:buttonView];    
}
4

3 に答える 3

0

Rinjuの答えはうまくいくでしょうが、もう少し説明が必要です. このボタンのグリッドを作成する正確な理由はわかりませんが (詳細情報があればよいでしょう)、各ボタンに新しいビューを表示する場合は、タグが重要です!

同じビューを開きたいが、そのビューに異なるプロパティが表示されている場合は、新しいビュー コントローラー クラスを作成する必要があります。これを と呼びましょうDetailViewController

ここで、buttonPressed:メソッドで、このビュー コントローラーをインスタンス化し、そのプロパティを設定する必要があります。

@interface DetailViewController : UIViewController
@property (nonatomic, assign) int buttonTag;
...
//other methods, properties, etc. here
...
@end

これで、ボタンがあるView Controllerでこれを行うことができます(簡単にするために、ストーリーボードを使用していると仮定します。そうでない場合でも、Rinjuが行ったことと同様に簡単に実現できます)。

-(void)buttonPressed:(UIButton*)button {
    [self performSegueWithIdentifier:@"DetailView" sender:button];
}

prepareForSegueこれで、セグエが起動する直前に呼び出されるメソッドを実装できます。

-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender {
    if( [[segue identifier] isEqualToString:@"DetailView"] ) {
        DetailViewController *detailView = [segue destinationViewController];
        detailView.buttonTag = ((UIButton*)sender).tag;
    }
}

タグが新しい詳細ビュー コントローラーに設定されたので、おそらく DetailViewController で switch ステートメント (または、この buttonTag が渡されたモデル オブジェクト) をviewDidLoad:使用して、そこに UI を設定できます。基本的には、ボタンのタグを使用してどのボタンが押されたかを識別し、これに基づいて新しいビューを作成します。

typedef enum生の整数を使用する代わりに、タグの名前を作成する構造を作成することをお勧めします。これにより、コードの可読性が向上し、混乱を避けるのにも役立ちます;)

于 2012-07-14T23:54:39.457 に答える
0

たぶん、アクションを接続したいですか?

[button addTarget:self 
         selector:@selector(buttonPressed:) 
 forControlEvents:UIControlEventTouchUpInside];

(構文を確認してください。これはメモリによるものです...)

于 2012-06-20T08:28:15.703 に答える
-2
-(void)buttonPressed:(UIButton *)button
{
NSLog(@"button %u -- frame: %@", button.tag, NSStringFromCGRect(button.frame));
Cart *crtObj=[[Cart alloc]initWithNibName:@"Cart" bundle:nil];
[self.navigationController pushViewController:crtObj animated:YES];
[crtObj release];
}
于 2012-06-20T08:26:13.700 に答える