演示不使用UIViewController的presentViewController:animated:completion:和dismissViewControllerAnimated:completion:方法,直接使用Storyboard的Segue来完成如下程序:
点击按钮后,present一个新的ViewController。并且当用户选择确定但是没有输入任何文字时,保持在当前ViewController内并提示用户。当用户输入了文字然后选择确定或者直接选择取消后,返回上一个ViewController,并处理数据。
首先,当然需要在Storyboard中创建3个ViewController,一个是主ViewController(类型就是ViewController),第二个是Navigation Controller,第三个是将会被present的ViewController,取名PresentedViewController。如下图:
接着将第一个ViewController中的触发按钮Segue到第二个Navigation Controller中。然后把第三个PresentedViewController中的界面设计好,并设置好Autolayout。
注意把ViewController按钮到Navigation Controller中Segue的Style设置为modal:
接着把UITextField连接到PresentedViewController类型中,看PresentedViewController类型定义:
@interface PresentedViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *textField;
//判断是否是点击确定后返回的主ViewController
@property (nonatomic, assign) BOOL isSaved;
//确定按钮点击事件
- (IBAction)okClick:(id)sender;
@end
okClick是确定按钮点击的事件,他会判断UITextField中是否有文字,如果有的话,执行返回到上一个ViewController的Segue,代码如下:
- (void)okClick:(id)sender
{
//判断文本是否为空
if (!self.textField.text.length)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Are you kidding me???" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
else
{
_isSaved = YES;
//手动执行backToMain的Segue
[self performSegueWithIdentifier:@"backToMain" sender:self];
}
}
接着在Storyboard中通过Control+拖拽连接确定按钮和下面的ViewController图标,然后选择列表中的okClick事件方法,如下图:
同时,主ViewController需要定义一个接受用来返回到当前页面的Segue方法,这种方式也叫Unwind Segue,如下主ViewController类型定义:
@interface ViewController : UIViewController
//回到主ViewController的Unwind Segue
- (IBAction)backToMain:(UIStoryboardSegue*)segue;
@end
其中backToMain实现方法会通过segue.sourceViewController返回执行这个Segue的ViewController也就是本例的PresentedViewController,接着通过判断PresentedViewController的isSaved属性来决定是取消还是确定所触发的Segue,如果是确定的话,再访问PresentedViewController中的UI数据。如下代码:
- (void)backToMain:(UIStoryboardSegue*)segue
{
//通过segue.sourceViewController返回执行这个Segue的ViewController也就是本例的PresentedViewController
PresentedViewController *presentated = segue.sourceViewController;
//判断是否是通过确定按钮返回的
if (presentated.isSaved)
{
//输出PresentedViewController中的UI数据
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:[NSString stringWithFormat:@"你输入的是:%@", presentated.textField.text] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
else //用户取消
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"取消了" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
}
接着需要把取消按钮连接到Storyboard下方Exit图标内的主ViewController中的backToMain方法,如下图:
最后还有一步,上面代码中,当用户选择确定且UITextField中有内容后,会手动执行返回到主ViewController中的Segue,这个Segue的名称是backToMain,但是我们还没有对这个Segue进行命名,所以需要切换至Xcode左侧Storyboard设计面板中的对象列表,选中这个Segue(名称是Unwind segue from 取消 to Exit),如下图:
在右侧Attributes inspector中设置Identifier也就是名称为我们需要的名称:backToMain。
源代码下载
下载页面
注意:链接是微软SkyDrive页面,下载时请用浏览器直接下载,用某些下载工具可能无法下载
源代码环境:Xcode 5.0