在目标视图控制器中获取segue的发送者
我有一个名为Dashboard(D)的VC,它可以打开一个名为Login(L)的VC和一个名为Register(R)的VC。 登录也可以打开VC Register。
我尝试尽可能多地使用故事板,所以我用它创建了三个Segues,D到L,D到R,L到R
因此,在D – > L – > R的情况下,并且在D – > R的情况下,当我关闭R时,如果必要则我必须关闭L并告知D他可以开始加载用户信息(启动function在概括地说)。
所以,我想在目的地vc中获得Segue的发送者,知道我把它放在senderSegueWithIdentifier的发送者中,就像那样:
[self performSegueWithIdentifier:@"SegueToFbRegister" sender:self];
我这样做是让R在注册/登录完成后发送通知,让D听取它然后弹出所有内容并加载你的数据。
但是,如果您坚持要获取对发件人的引用,则可以在目标VC上添加此属性,并将其设置在源VC的prepareForSegue:sender:
这听起来像是一个使用代表的好地方。 在RegisterViewController.h中定义这样的协议
@protocol RegisterViewDelegate - (void)tellRegisterDelegateSomething:(NSObject*)something; @end
然后在你的class级上保留一个指向你的代表的指针
@interface RegisterViewController : UIViewController @property (weak, nonatomic) id delegate; @end
现在告诉呈现视图控制器他们实现刚刚创建的新协议。 这是在显示此视图的其他viewcontrollers的.h文件中完成的。
在LoginViewController.h中
@interface LoginViewController : UIViewController @end
在DashboardViewController.h中
@interface DashboardViewController : UIViewController @end
在上述类的.m文件中,实现协议的方法
- (void)tellRegisterDelegateSomething:(NSObject*)something { }
现在,您需要在从这样的呈现视图控制器执行segue时分配委托。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"SegueToFbRegister"]) { RegisterViewController* destination = [segue destinationViewController]; destination.delegate = self; } }
现在你可以调用呈现视图控制器(委托)并让它对你需要发送回的任何信息做一些事情(这将在你的RegisterViewController.m中调用)。
if ([self.delegate respondsToSelector:@selector(tellRegisterDelegateSomething:)]) { // Tell the delegate something. [self.delegate tellRegisterDelegateSomething:something]; }
您需要通过两个控制器传回的实例,您遵循相同的基本模式。
@protocol LoginViewDelegate - (void)tellLoginDelegateSomething:(NSObject*)something; @end
然后在你的class级上保留一个指向你的代表的指针
@interface LoginViewController : UIViewController @property (weak, nonatomic) id delegate; @end
现在告诉Dashboard视图控制器它实现了协议。 这是在显示此视图的仪表板视图控制器的.h文件中完成的。
在DashboardViewController.h中
@interface DashboardViewController : UIViewController @end
在DashboardViewController的.m文件中实现协议的方法
执行segue时,请遵循上面在viewcontroller上设置委托的模式。 现在,当在LoginViewController中调用委托方法时,您也可以在DashboardViewController中调用委托。
在LoginViewController.m中
- (void)tellRegisterDelegateSomething:(NSObject*)something { if ([self.delegate respondsToSelector:@selector(tellLoginDelegateSomething:)]) { // Tell the delegate something. [self.delegate tellLoginDelegateSomething:something]; } }
现在,您已全部连接,因此您可以通过两个控制器(或仅一个)传递数据并使用它执行某些操作。 您将知道您所处的场景,因为将根据哪个viewcontroller可见,在DashboardViewController中调用不同的委托方法。
希望这可以帮助。
为R创建一个委托,并使D和L实现委托方法。使用prepareForSegue:sender
来分配R的委托。当你在R中完成任务时,使用你的委托来执行被委托的动作。
另一种方法是使用展开segue。
将以下代码放在仪表板 ( D )视图控制器中。
@IBAction func loadUserInfoAfterRegistration(segue: UIStoryboardSegue) { }
在Interface Builder中,对Register ( R )视图控制器执行以下步骤:
- 选择完成注册时将按下的按钮。
- 按Ctrl + 拖动到视图顶部的退出符号。
- 从显示的列表中选择
loadUserInfoAfterRegistrationWithSegue:
使用这种方法, Register ( R )视图控制器将始终导航到Dashboard ( D )视图控制器,无论它们之间是什么。 它们之间的视图控制器不必触及。 在仪表板 ( D )视图控制器中加载用户数据也可以在上面声明的方法中定制。