在 UIButton 单击时以编程方式创建 Segue 或推送到另一个视图控制器

Posted

技术标签:

【中文标题】在 UIButton 单击时以编程方式创建 Segue 或推送到另一个视图控制器【英文标题】:Create Segue or Push to another View controller programmatically upon UIButton click 【发布时间】:2012-02-09 03:56:38 【问题描述】:

我正在尝试解决这个问题一段时间。我在 tableview 单元格中以编程方式创建 UIButton。单击按钮后,我想继续或推送到另一个视图控制器。如果我使用 StoryBoard,这是小菜一碟,在那里创建按钮,然后控制拖动一个 segue 到目标 VC。然而,出于各种原因,我不想这样做。以下是我目前的代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath



// <<<< bunch of code snipped out here to keep this example short >>>



for(UIButton *button in cell.subviews)

    [button removeFromSuperview];

UIImage *image = [UIImage imageNamed:[contentArray_ objectAtIndex:indexPath.row]];
UIButton *imageButton = [[UIButton alloc] initWithFrame:CGRectMake(5, 5, 240, 240)];
[imageButton setImage:image forState:UIControlStateNormal];
imageButton.layer.masksToBounds = YES;
imageButton.layer.cornerRadius = 5.0;
imageButton.layer.borderWidth = 1.0;
imageButton.layer.borderColor = [[UIColor grayColor] CGColor];

CGAffineTransform rotateButton = CGAffineTransformMakeRotation(M_PI_2);
imageButton.transform = rotateButton;

cell.backgroundColor = [UIColor clearColor];
[cell addSubview:imageButton];

return cell;

现在,对于此表中的每一行,将以编程方式创建一个带有图像的按钮。我还旋转了按钮 -​​ 是的,这是一个水平表格视图。

那么我如何对按钮点击采取行动?所有按钮都将转到同一个目标视图控制器...

PS - 我正在使用带有 ARC 的 Xcode 4.2(不确定这是否真的重要)。


----- 更新问题

我已经实现了代码建议(感谢 jrturton),但是我相信因为我在 UITableView 单元格中,所以我无法呈现模态视图控制器。我现在有以下代码...

.h 文件:

@interface DetailsHorizontalPhotoCell : UITableViewCell <UITableViewDataSource, UITableViewDelegate>

@property (nonatomic, strong) IBOutlet UITableView *horizontalTableView;
@property (nonatomic, strong) NSArray *contentArray;

- (IBAction)photoButton:(id)sender;
@end

.m 文件:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    /// ----- code here to setup the cell, button, image, etc...

    // do something when the buttong is pressed
    [imageButton addTarget:self action:@selector(photoButton:) forControlEvents:UIControlEventTouchUpInside];

    return cell;


- (IBAction)photoButton:(id)sender 

    CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.horizontalTableView];
    NSIndexPath *hitIndex = [self.horizontalTableView indexPathForRowAtPoint:hitPoint];

    // do some stuff here to pull object data out of the contentArray
    NSLog(@"Image clicked, index: %d", hitIndex.row);
    // other non-relevant code snipped to keep this example short

    // next I want to present a modal view controller (lets call it PhotoAlbum) which is a TableViewController

    PhotoAlbum *photoAlbum = [[PhotoAlbum alloc] init];

    // below does not work, does not even autocomplete in Xcode. I believe its because I'm in a UITableViewCell and not a VC... Any suggestions here?
    [photoAlbum setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
    [self presentModalViewController:photoAlbum animated:YES];

【问题讨论】:

【参考方案1】:

我不确定您为什么每次都在单元格中重新创建按钮而不是更改图像,但我们现在先忽略它。

您可以将所有按钮连接到表格视图控制器中的相同操作,此操作可以像往常一样采用sender 参数。

你像这样添加一个动作:

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

这会在你的视图控制器中调用一个带有签名的方法:

 -(void)buttonPressed:(UIButton * sender)

在这个方法中,你可以检测出点击了哪一行:

CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint];

然后执行您喜欢的任何其他操作。

【讨论】:

谢谢你,这很完美! PS - 回到你的另一个陈述“不确定你为什么每次都重新创建按钮”。关于我应该如何纠正这个问题的任何建议? 将按钮作为单元格的属性,仅在创建新单元格时创建它(如果单元格==nil 则在内部),其他时候只需调用它的 setImage 方法。如果您不使用单元子类,您可以在创建按钮时为其添加标签,然后调用 viewWithTag: 以获取指向按钮的指针。 jrturton - 我已经更新了我的问题,我似乎无法弄清楚为什么我不能从我的 IBAction 中呈现模态 VC。我认为这是因为我在 UITableViewCell 但我不确定。对此的任何帮助将不胜感激! 所有这些代码都应该在您的视图控制器中,而不是您的单元格中。而且你真的应该开始一个新问题,没有人会阅读一个接受了答案的问题。 我并不是说您不应该提出新问题,但我一直在阅读具有公认答案的问题

以上是关于在 UIButton 单击时以编程方式创建 Segue 或推送到另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

按下时以编程方式移除 UIBarButtonItem 上的灯光?

更改以编程方式创建的单击 UIButton 的背景图像

对于以编程方式创建的 UIButton,有时不会触发按钮单击事件

在 UIScrollView 中以编程方式依次单击 10 个 UIButton

动画完成后无法单击 UIButton(以编程方式显示)

如何导航 UIViewController 作为以编程方式创建的 UIButton 操作的目标