现在我们要实现两个窗体之间的传值
segue
这个在顺传的时候的起的作用,我们用两个窗体举例子来说明
- segue的概念和作用:
- segue就是指进行跳转的那根连线
- segue的三个常用属性:
- identifier:当前segue的标识
- destinationViewController:segue的目标控制器
- sourceViewController: segue的源控制器
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(nullable id)sender NS_AVAILABLE_IOS(5_0);
- 方法的使用:
- 无论进行那一种跳转,都会调用这个方法
- 无论当前控制器中的那一个跳转,都会调用这个方法
- 在这个方法中实现参数传递:
我们在跳转的时候,通过segue的destinationViewController找到对应的控制器,进而取到我们的控制器
- 我们可以指定代理,给下一个控制器需要的数据模型,传递数据
这个控制器是我们展示数据tableView: 以下是关键代码
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.destinationViewController isKindOfClass:[ZYEditViewController class]])
{
ZYEditViewController *vc = (ZYEditViewController *)segue.destinationViewController;
//指定代理
vc.delegate = self;
//选中的行
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
vc.contact = self.contacts[path.row];
}
}
代理
- 当我们的控制器需要将数据返回给上一个窗体,比如当前的这个控制器是编辑控制器
- 方法有两个
- 引用上一个控制器,拿到上一个控制器。(不合理)
- 代理,让上一个控制器作为我们的代理
- 那么说到代理,就是我们熟悉的几部曲了:
- 在当前窗体 .h
@protocol ZYEditViewControllerDelegate <NSObject>
@optional
- (void)editViewController:(ZYEditViewController *)vc;
@end
@interface ZYEditViewController : UIViewController
@property(nonatomic,weak)id<ZYEditViewControllerDelegate>delegate;
- 在当前窗体的.m文件中,我们需要判断一下 再进行调用
- (IBAction)saveBtnClick
{
//代理方法
if ([self.delegate respondsToSelector:@selector(editViewController:)]) {
[self.delegate editViewController:self];
}
}
- 在上一个控制器中,既然我们在prepareForSegue中指定了代理,那么我们就可以实现代理了:
#pragma mark - ZYEditViewControllerDelegate的代理方法
- (void)editViewController:(ZYEditViewController *)vc
{
[self saveData];
//刷新指定的行
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
[self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationFade];
}
搞定!
如果连线只有一根,我们只是为了单纯的做一些简单的判断(如登录判断),满足条件就跳转的话,那么segue还有一个方法
self performSegueWithIdentifier:<#(nonnull NSString *)#> sender:<#(nullable id)#>
这里我们只需要指定下一个控制器的identifier就行了