【问题标题】:Calling ViewController's method that pushes another ViewController from App Delegate调用 ViewController 的方法,从 App Delegate 推送另一个 ViewController
【发布时间】:2016-05-06 17:07:21
【问题描述】:

在开始之前,我已经搜索了 Stackoverflow 以了解如何执行此操作,并且我看到了很多相关的帖子,但没有一个对我有用,我不知道为什么。

所以基本上我有一个 loginViewController,在其中,我有一个调用 GoogleSignIn 的方法:

- (void)googleTap:(id)sender
{
    [[GIDSignIn sharedInstance] signIn];
}

现在设置 GoogleSignIn 的方式,登录调用的结果在 AppDelegate.m 中处理

- (void)signIn:(GIDSignIn *)signIn
didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {
    // Perform any operations on signed in user here.
    if (!error) {
        NSString *userId = user.userID;                  // For client-side use only!
        NSString *idToken = user.authentication.idToken; // Safe to send to the server
        NSString *name = user.profile.name;
        NSString *email = user.profile.email;

        NSLog(@"Name: %@, User: %@, Token: %@, Email: %@",name, userId, idToken, email);

        // ...
    }
}

在这个 AppDelegate 方法中,我想从我的 loginViewController 中调用一个方法:

-(void)onSuccessfulLogin{
    NSLog(@"On Successful Login");
    [self.navigationController pushViewController:[collectionViewController new] animated:YES];
}

我尝试了这些答案:Calling UIViewController method from app delegate

want to call ViewController's method from appdelegate

NSLog 被调用,但新的 ViewController 从未被推送...为什么会这样,我怎样才能让它工作?

【问题讨论】:

  • self.navigationController 为零吗?
  • 从 google 下载 google sdk 并解压,您将看到示例代码,希望它能解决您的问题。

标签: ios objective-c uiviewcontroller appdelegate


【解决方案1】:

如果这是您的应用委托,则您没有 self.navigationController。您可能更改了NavigationController to something like UINavigationController *navigationController = [[UINavigationController alloc] init] 的名称您需要为委托类上的导航控制器设置@property。然后在哪里初始化导航控制器

 UINavigationController *navigationController = [[UINavigationController alloc] init]`
self.navigationController = navigationController// You need this line.


//In your method
    [self.navigationController pushViewController:[collectionViewController new] animated:YES];

【讨论】:

  • 嗨,马修,感谢您的帮助。该方法实际上在我的 loginViewController.m 中,它确实可以访问 self.navigationController。当我从 loginViewController.m 中调用该方法时,它运行良好。现在我试图从 AppDelegate 中调用相同的方法。我需要这样做,因为我的 Google SignIn 在 AppDelegate 中收到了数据。
  • 您应该将该数据传递给您的 viewController 或直接传递给您的 navigationController。当您在应用程序委托中引用 self 时,这意味着 self 是 App Delegate 的一个实例,而不是 viewController。你需要一个 viewController 的实例,它是 navController 的 rootViewController,来调用 pushViewController。看起来像[loginViewControllerInstance.navigationController pushViewController:[collectionViewController new] animated:YES];
【解决方案2】:

在 YourViewController.h(头文件)中声明你的 onSuccessfulLogin 方法

在 (void)signIn:didSignInForUser:withError: 方法中,将下面的代码放在底部

if ([self.navigationController.viewControllers.lastObject respondsToSelector:@selector(onSuccessfulLogin)]) {
    [((YourViewController *)self.navigationController.viewControllers.lastObject) onSuccessfulLogin];
}

【讨论】:

    【解决方案3】:

    我一直在想这个错误。您可以将 GDSignInDelegate 从 AppDelegate 移动到 viewcontroller.h。

    然后您可以简单地将 -(void)signIn: didSignInUser: 方法移动到您的 ViewController。你可以从那里调用你的方法!

    【讨论】:

    • 对,在引用 self 时这样做你实际上是在引用 ViewController 的一个实例,所以你的 pushViewController 方法实际上可以工作:)
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2018-04-27
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多