Swift中TabBar视图间无法传递数据问题求助
问题原因及解决方案
核心问题
你现在的代码是从Storyboard重新实例化了一个新的ListViewController对象,并给这个新对象的distance赋值,但TabBarController中实际显示的ListViewController是另一个早已初始化好的实例——这两个是完全独立的对象,所以你给新实例的赋值不会影响到TabBar里正在运行的那个VC,自然打印出来的distance还是nil。
正确解决方案
直接获取TabBarController中已存在的ListViewController实例,再给它的属性赋值:
修改第一个视图控制器的代码:
// 从当前TabBarController中获取已存在的ListViewController实例 if let tabBarController = self.tabBarController, let targetVC = tabBarController.viewControllers?.first(where: { $0 is ListViewController }) as? ListViewController { // 给已存在的实例赋值 targetVC.distance = "abc" // 手动更新UI(因为目标VC的viewDidLoad已经执行过,不会自动刷新label) targetVC.label.text = targetVC.distance }
补充优化
如果目标VC还未被用户切换到(即viewDidLoad还没执行),可以在ListViewController中添加属性监听,让UI自动更新:
修改ListViewController的代码:
@IBOutlet weak var label: UILabel! var distance: String? { didSet { // 只要distance值变化,就更新label(不管view是否已加载) label?.text = distance } } override func viewDidLoad() { super.viewDidLoad() label.text = distance }
这样不管目标VC是否已经加载,只要distance被赋值,label都会自动同步更新。
内容的提问来源于stack exchange,提问作者batudmrc
相关产品推荐
相关产品推荐

