如何从UITabBarViewController获取对视图控制器的引用

问题描述:

编辑:我在我的方法中脱离了基础。我试图将数据从一个VC传递到另一个。源VC不受选项卡栏的控制,因此我无法通过它来引用目标VC。我试图通过Storyboard引用目标VC,但目标VC上的数据仍然为零。我正在使用核心数据,并希望将ManagedObjectContext传递给另一个VC。下面是代码:如何从UITabBarViewController获取对视图控制器的引用

...... 
        do { 
         try self.managedObjectContext.save() 
         appUserID = user.userID! 
         } catch { 
         fatalError("Error: \(error)") 
        } 
       } 
      } 
     self.passManagedObjectContext() 
    } 

    func passManagedObjectContext() { 
     let profileTableViewController = UIStoryboard(name: "Profile", bundle: nil).instantiateViewController(withIdentifier: "ProfileViewController") as! ProfileTableViewController 
      profileTableViewController.managedObjectContext = self.managedObjectContext 
     } 


I am passing data from the AppDelegate to other ViewControllers by referencing my TabBarViewControllers stack like so: 



    let tabBarController = window!.rootViewController as! UITabBarController 
     if let tabBarViewControllers = tabBarController.viewControllers { 
      let profileNavController = tabBarViewControllers[4] as! UINavigationController 
      let profileTableViewController = profileNavController.topViewController as! ProfileTableViewController 
      profileTableViewController.managedObjectContext = context 
     } 
    } 
..... 

编辑完 我想现在要做的相同,但来自一个视图控制器到另一种是通过标签栏(无SEGUE)进行访问。上面的代码不承认window!.rootViewController我怎么可以参考根UITabBarController?

+0

您可以使用segue共享跨栏控制器的跨数据视图控制器 – Krunal

+0

您在AppDelegate中的何处/何时试图执行此操作? – DonMag

+0

@DonMag我之前已经从AppDelegate传递数据,并试图在VC之间使用相同的方法它们不是同一个导航堆栈的一部分,我不能通过Tab Bar来完成,所以我试图通过故事板。谢谢。 –

UIViewController有一个内置的可选属性tabBarController,让您的视图控制器内部可以访问tabBarController像这样:

if let tabBarController = tabBarController { 
    //get the controller you need from 
    //tabBarController.viewControllers 
    //and do whatever you need 
} 

这里

UIViewController: 'Getting Other Related View Controllers'

:在 Apple's UIViewController documentation的“获取其他相关视图控制器”部分可用属性的当前目录
+0

我试过你的方法,但只有后来才意识到源VC不是Tab Bars集合的一部分。我试图通过故事板来完成。仍然没有运气。已经更新了这个问题。谢谢。 –

+0

而不是尝试在视图控制器的基础上传递托管对象上下文,是否尝试从任何需要它的视图控制器的AppDelegate访问它? – BJHStudios