Segue的属性
1、唯一标识
@property (nonatomic, readonly) NSString *identifier;
2、来源控制器
@property (nonatomic, readonly) id sourceViewController;
3、目标控制器
@property (nonatomic, readonly) id destinationViewController;
在非自动的情况,完成二个控制器跳转的方法
其中第一个参数就是挑战中连线取的名字
self 就是来源控制器
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
二:
顺着传递数据
二个控制器之间传递数据,通过控制器实现某个方法达到数据的传递
控制器实现这个方法后,可以传递数据
逻辑:从segue中可以取得目的的controller,拿到后可以做出对应的操作,如设置标题
/**
* 执行Segue后,跳转之前会调用这个方法
* 给下一个控制器传递数据
*/
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
}
三:
数据的传递:回传,从后一个控制器回到前面前面一个控制器
思想:如果逆向传递,采用代理
步骤:
--------------------------------------------------------------------------------------------------------
默认进入controller弹出键盘
思想:让输入框称为第一响应
[self.nameField becomeFirstResponder];//成为第一响应者
退出键盘
[self.nameField resignFirstResponder];//退出第一响应者
小技巧:
这里弹出键盘的时机也是有考虑,更好的是当整个控制器的视图都显示完毕再弹出,因此走生命周期的方法会很好
逻辑分析:数据提供的ViewController做到数据源提供,而标源的接受只需要遵守我们的代理,代理的方法中就会将数据传递过去
1、先写一个代理:
@protocol AddViewControllerDelegate <NSObject>
@optional
- (void)addViewControllerDidAddContact:(AddViewController *) addVc;
@end
2、将写好的代理作为数据源提供的controller的成员变量
@property(nonatomic, weak) id<AddViewControllerDelegate> delegate;
3、传递数据就是通知代理,这样数据便完成了传递
//传递数据给前一个控制器,
//通知代理,
if ([self.delegate respondsToSelector:@selector(addViewControllerDidAddContact:)]) {
[self.delegate addViewControllerDidAddContact:self];
}
4、目标controller遵守对应的代理
@interface ContactsViewController () <UIActionSheetDelegate, AddViewControllerDelegate>
实现对应的方法
/**
* 代理方法,添加数据的Controller发生数据传递,从而调用代理方法
*/
- (void)addViewControllerDidAddContact:(AddViewController *)addVc
{
NSLog(@"fuck");
}
5、当然还有一个最重要的操作就是:将代理方法传递
思想:因为segue中可以拿到自己contr和目的的destination二个controller,这里就是做设置代理传递最好的地方
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
AddViewController *addVc = segue.destinationViewController;
addVc.delegate = self;
}
6、还有一个非常重要的一点:
顺传数据,不要再set方法中赋值数据,因为controller控制器还没有家在view,而应该在viewDidLoad中加载
逆传数据,则在代理方法中完成操作
Segue --数据传递、顺传、逆传
最新推荐文章于 2023-02-15 21:35:13 发布