如何让UIKit按钮打开另一个视图?

时间:2012-06-20 08:20:38

标签: objective-c ios xcode

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

-(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];    
}

3 个答案:

答案 0 :(得分:0)

也许你想连接一个动作?

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

(检查语法,这是通过内存...)

答案 1 :(得分: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;
    }
}

现在为新的详细信息视图控制器设置了标记,您可以在DetailViewController的viewDidLoad:中使用switch语句(或者更好的是,传递此buttonTag的模型对象)来设置UI那里。基本上我们正在做的是使用按钮的标签来区分按下哪个按钮,并在此基础上创建一个新视图!

您可能想要做的是创建一个typedef enum结构来为标签创建名称而不是使用原始整数。这样可以提高代码的可读性,也可以帮助您避免混淆;)

答案 2 :(得分:-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];
}