0

我在一页中有一个按钮网格。我希望按钮在单击时会导致另一个视图。我应该在以下操作中添加什么来更改视图?

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

现在,在按钮所在的视图控制器中,您可以执行此操作(为了简单起见,我假设您使用的是故事板。如果没有,它仍然可以像 Rinju 所做的那样轻松完成)。

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

现在,您可以实现prepareForSegue在 segue 触发之前调用的方法:

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

既然为新的详细视图控制器设置了标签,您可能可以使用viewDidLoad:DetailViewController 中的 switch 语句(或者更好的是,传递此 buttonTag 的模型对象)在那里设置 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 回答