使按钮 UIAlertView 执行 Segue

Posted

技术标签:

【中文标题】使按钮 UIAlertView 执行 Segue【英文标题】:Make button it UIAlertView perform Segue 【发布时间】:2013-07-17 19:37:41 【问题描述】:

我为一个动作创建了一个UIAlertView,它给了我两个选项。我希望用户能够单击一个按钮并让它执行 Segue。

这是我目前的代码:

- (IBAction)switchView:(id)sender

    UIAlertView *myAlert = [[UIAlertView alloc]
                            initWithTitle:@"Please Note"
                            message:@"Hello this is my message"
                            delegate:self
                            cancelButtonTitle:@"OK"
                            otherButtonTitles:@"Option 1", @"Option 2", nil];
    [myAlert show];


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];

    if ([buttonTitle isEqualToString:@"Option 1"]) 



    

【问题讨论】:

这个问题你解决了吗? 【参考方案1】:

是的,一开始不是很明显,你需要手动创建一个segue。

选择将执行推送的 ViewController(我是推送的人),并将手动连接到推送的视图控制器(推送的视图控制器)。

ios 8+ 与 Swift

选择新创建的segue,并给它起一个名字(在我的例子中是"segue.push.alert",用于记录日志的长名称),并在alert的动作中调用perform segue,比如:

let alert = UIAlertController(title: "My Alert", message: "Be Alerted. This will trigger a segue.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
alert.addAction(UIAlertAction(title: "Segue", style: .Default, handler:

    [unowned self] (action) -> Void in
    
    self.performSegueWithIdentifier("segue.push.alert", sender: self)
))

presentViewController(alert)

[unowned self] 应该小心处理,如果视图控制器可以在操作发生时解除分配,你最好使用[weak self],然后如果可以发生解除分配,则执行self?.performSegue...

旧答案

现在,在您的情况下,您可以从视图控制器简单地调用 performSegueWithIdentifier:sender:

// Using enums is entirely optional, it just keeps the code neat.
enum AlertButtonIndex : NSInteger

    AlertButtonAccept,
    AlertButtonCancel
;

// The callback method for an alertView
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)index

    if (index == AlertButtonAccept)
    
        [self performSegueWithIdentifier:@"segue.push.alert" sender:self];
    

以这种方式拥有 segue(而不是直接编码)的优势在于,您仍然可以很好地概览您的应用程序流程,混合编码的 segue 和加载故事板的 segue 有点违背了目的。

【讨论】:

你真的可以在代码中的任何地方做到这一点吗?我不能;似乎无法从自定义 UIView 类中做到这一点 @RaduSimionescu 是的,很抱歉,已编辑。在您的情况下,视图不应该干扰应用程序的流程,视图应该只关注自己的绘制。 这对我来说很棒,非常感谢!将加号按钮从父控制器拖到目标控制器,不需要按下控制。【参考方案2】:

如果你在故事板中给你的 segue 一个标识符,你可以这样做:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];

    if ([buttonTitle isEqualToString:@"Option 1"]) 

        [self performSegueWithIdentifier:@"foo" sender:nil];

    

【讨论】:

但是我应该在故事板中将 Segue 与哪个按钮链接?我显然必须按 ctrl + 按钮并拖动它来链接 Segue 才能给它一个 id? 不需要按钮——只需将 UIViewController 连接到 UIViewController。在列出所有元素的侧栏中执行有时最简单。【参考方案3】:

这是加载 ViewController 的另一种方法。您可以使用情节提要标识符。阅读:What is a StoryBoard ID and how can i use this?

首先在 Identity Inspector 中设置 Storyboard ID,然后将以下代码添加到您的警报委托中。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];

    if ([buttonTitle isEqualToString:@"Option 1"]) 

        // This will create a new ViewController and present it. 
        NewViewController *newViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"NewViewControllerID"];

        [NewViewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
        [self presentViewController:NewViewController animated:YES completion:nil];

    

希望这会有所帮助! :)

【讨论】:

以上是关于使按钮 UIAlertView 执行 Segue的主要内容,如果未能解决你的问题,请参考以下文章

使 UIAlertView 按钮触发功能 On Press

UIAlertView 操作和取消按钮

更改 UIAlertview 和 UIActionsheet 按钮的色调颜色

UIAlertView 按钮操作

UIAlertView 灰色按钮

如何更改 UIAlertView 按钮的宽度?