12

我有一个名为 Dashboard (D) 的 VC,它可以打开一个名为 Login (L) 的 VC 和一个名为 Register (R) 的 VC。登录也可以打开VC注册。

我尝试尽可能多地使用故事板,所以我用它创建了三个 Segue,D 到 L,D 到 R,L 到 R

因此,在 D -> L -> R 和 D -> R 的情况下,当我关闭 R 时,我必须在必要时关闭 L 并通知 D 他可以开始加载用户信息(在简而言之)。

因此,我想在目标 vc 中获取 Segue 的发件人,因为我知道我将它放在 performSegueWithIdentifier 的发件人条目中,如下所示:

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

4 回答 4

8

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

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

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

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

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

在 LoginViewController.h

@interface LoginViewController : UIViewController <RegisterViewDelegate>
@end

在 DashboardViewController.h

@interface DashboardViewController : UIViewController <RegisterViewDelegate>
@end

在上述类的.m文件中,实现协议的方法

- (void)tellRegisterDelegateSomething:(NSObject*)something
{
}

现在,当您从这样的任何一个呈现视图控制器执行转场时,您需要分配委托。

- (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

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

在 DashboardViewController.h

@interface DashboardViewController : UIViewController <RegisterViewDelegate, LoginViewDelegate>
@end

在 DashboardViewController 的 .m 文件中实现协议的方法

执行 segue 时,请遵循上述在视图控制器上设置委托的模式。现在,当在 LoginViewController 中调用委托方法时,您也在 DashboardViewController 中调用委托。

在 LoginViewController.m

- (void)tellRegisterDelegateSomething:(NSObject*)something
{
    if ([self.delegate respondsToSelector:@selector(tellLoginDelegateSomething:)])
    {
        // Tell the delegate something.
        [self.delegate tellLoginDelegateSomething:something];
    }
}

现在你们都已连接,因此您可以通过两个控制器(或仅一个控制器)传回数据并对其进行处理。您将知道您所处的场景,因为在 DashboardViewController 中将根据可见的视图控制器调用不同的委托方法。

希望这可以帮助。

于 2013-02-19T18:55:25.367 回答
8

我会通过让 R 在注册/登录完成时发送通知来做到这一点,并让 D 听它然后弹出所有内容并加载您的数据。

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

于 2013-02-19T18:30:35.313 回答
0

为R创建一个委托,并使DL实现委托方法prepareForSegue:sender。用于分配R的委托。当您在R中完成任务时,使用您的委托执行所需的操作。

于 2013-02-19T18:36:58.863 回答
0

另一种方法是使用 unwind segue。

将以下代码放在您的仪表板D)视图控制器中。

@IBAction func loadUserInfoAfterRegistration(segue: UIStoryboardSegue) {

}

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

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

使用这种方法,Register ( R ) 视图控制器将始终导航到Dashboard ( D ) 视图控制器,无论它们之间是什么。它们之间的视图控制器不必被触及。Dashboard ( D ) 视图控制器中用户数据的加载也可以在上面声明的方法中进行自定义。

于 2017-10-27T10:22:29.763 回答