问题 在目标视图控制器中获取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他可以开始加载用户信息(启动功能在概括地说)。

所以,我想在目的地vc中获得Segue的发送者,知道我把它放在senderSegueWithIdentifier的发送者中,就像那样:

[self performSegueWithIdentifier:@"SegueToFbRegister" sender:self];

1125
2018-02-19 18:13


起源



答案:


我这样做是让R在注册/登录完成后发送通知,让D听取它然后弹出所有内容并加载你的数据。

但是,如果您坚持要获取对发件人的引用,则可以在目标VC上添加此属性并将其设置在源VC中 prepareForSegue:sender:


8
2018-02-19 18:30



非常感谢您的快速回复,我不知道通知。我试试看起来更合适的方式。但是你知道关闭R和L的最佳方法,知道L可能不是创建的。 - Thomas Leduc
你在用吗? UINavigationController ?如果是这样, popToRootViewController: 将删除已推送的所有VC。如果您正在提出模态VC,请致电 dismissViewControllerAnimated:completion: 在已经呈现的第一个控制器上也将关闭所有已经呈现在其上的其他控制器。 - Taum


答案:


我这样做是让R在注册/登录完成后发送通知,让D听取它然后弹出所有内容并加载你的数据。

但是,如果您坚持要获取对发件人的引用,则可以在目标VC上添加此属性并将其设置在源VC中 prepareForSegue:sender:


8
2018-02-19 18:30



非常感谢您的快速回复,我不知道通知。我试试看起来更合适的方式。但是你知道关闭R和L的最佳方法,知道L可能不是创建的。 - Thomas Leduc
你在用吗? UINavigationController ?如果是这样, popToRootViewController: 将删除已推送的所有VC。如果您正在提出模态VC,请致电 dismissViewControllerAnimated:completion: 在已经呈现的第一个控制器上也将关闭所有已经呈现在其上的其他控制器。 - Taum


这听起来像是一个使用代表的好地方。在RegisterViewController.h中定义这样的协议

@protocol RegisterViewDelegate <NSObject>
- (void)tellRegisterDelegateSomething:(NSObject*)something;
@end

然后在你的班级上保留一个指向你的代表的指针

@interface RegisterViewController : UIViewController
@property (weak, nonatomic) id <RegisterViewDelegate> delegate;
@end

现在告诉呈现视图控制器他们实现刚刚创建的新协议。这是在显示此视图的其他viewcontrollers的.h文件中完成的。

在LoginViewController.h中

@interface LoginViewController : UIViewController <RegisterViewDelegate>
@end

在DashboardViewController.h中

@interface DashboardViewController : UIViewController <RegisterViewDelegate>
@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 <NSObject>
- (void)tellLoginDelegateSomething:(NSObject*)something;
@end

然后在你的班级上保留一个指向你的代表的指针

@interface LoginViewController : UIViewController
@property (weak, nonatomic) id <LoginViewDelegate> delegate;
@end

现在告诉Dashboard视图控制器它实现了协议。这是在显示此视图的仪表板视图控制器的.h文件中完成的。

在DashboardViewController.h中

@interface DashboardViewController : UIViewController <RegisterViewDelegate, LoginViewDelegate>
@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中调用不同的委托方法。

希望这可以帮助。


8
2018-02-19 18:55



也谢谢你,但Taum的解决方案对于ios上的新手来说更简单。 - Thomas Leduc
那没问题。他的完全有效。使用委托方法只是更灵活,因为您可以使用当前视图中的信息回调您的委托。在具有模态或弹出视图的情况下,它也更有用,因为您可以将信息发送回委托,并且您不总是可以选择从导航控制器弹出这些类型的视图。即使对于新手来说,绝对是学习(而不是非常复杂)的强大工具。祝你好运 - johnrechd


为...创建委托 [R 和做 d 和 大号 实现委托方法。使用 prepareForSegue:sender 分配代表 [R当你完成任务时 [R 使用你的委托来执行所获得的行动。


0
2018-02-19 18:36





另一种方法是使用展开segue。

将以下代码放入您的手中 仪表板 (d)查看控制器。

@IBAction func loadUserInfoAfterRegistration(segue: UIStoryboardSegue) {

}

在Interface Builder中,执行以下步骤 寄存器 ([R)视图控制器:

  1. 选择完成注册时将按下的按钮。
  2. 按Ctrl + 拖动 到视图顶部的退出符号。
  3. 选择 loadUserInfoAfterRegistrationWithSegue: 从显示的列表中。

使用这种方法, 寄存器 ([R)视图控制器将始终导航到 仪表板 (d)查看控制器,无论它们之间是什么。它们之间的视图控制器不必触及。加载用户数据 仪表板 (d)视图控制器也可以在上面声明的方法中定制。


0
2017-10-27 10:22