使按钮 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的主要内容,如果未能解决你的问题,请参考以下文章