8

UIAlertView为一个动作创建了一个,它给了我 2 个选项。我希望用户能够单击一个按钮并让它执行 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"]) {



    }
}
4

3 回答 3

9

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

在此处输入图像描述

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

在此处输入图像描述

带有 Swift 的 iOS 8+

选择新创建的 segue,并给它一个名称(在我的例子中是"segue.push.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 有点违背了目的。

于 2013-07-18T18:20:41.110 回答
1

这是加载 ViewController 的另一种方法。您可以使用情节提要标识符。阅读:什么是 StoryBoard ID,我该如何使用它?

首先在 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];

    }
}

希望这可以帮助!:)

于 2014-03-28T01:41:11.737 回答
1

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

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

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

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

    }
}
于 2013-07-18T17:47:28.443 回答