如何将数据从视图控制器传递到标签栏控制器的第一个选项卡

时间:2017-12-28 05:26:03

标签: ios swift uitableview uitabbarcontroller

我想将图像和新闻从视图控制器传递到tabbar控制器的连接的第一个标签。第一个标签是NewsViewController没有显示新闻标题和图像。 didSelectRowAt indexPath方法如下。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    let storybaord=UIStoryboard(name: "Main", bundle: nil)
    let tabBar=storybaord.instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
    let DVC = tabBar.viewControllers?[0] as! NewsViewController
    tabBar.selectedIndex = 0
    DVC.getImage=sneakersnews[indexPath.row].image
    DVC.getNews=sneakersnews[indexPath.row].news
    self.navigationController?.pushViewController(tabBar, animated: true)
}

如何从表格视图中的第一个标签NewsViewController上传递和显示新闻和图像?

您可以从以下链接下载项目:

https://drive.google.com/file/d/1qfI3UaXoUTzOS6Jfe40wj99NAifVkz5Y/view?usp=sharing **

3 个答案:

答案 0 :(得分:3)

首先,你正在做两件不同的事情

  1. DiscoveryNewsViewController和tabbarController之间有一个segue

  2. 你正在按照这个

    推动tabbar控制器
    let DVC = tabBar.viewControllers?[0] as! NewsViewController
    //this is not required as it will always open UIViewController at Zero index so comment this
    //tabBar.selectedIndex = 0
    let image = sneakersnews[indexPath.row].image
    DVC.getImage = image
    let news = sneakersnews[indexPath.row].news
    DVC.getNews = news
    self.navigationController?.pushViewController(tabBar, animated: true)
    
  3. 请阅读上面代码中的注释行

    所以你不能一次做两个上面提到的点,因为segue连接已经在推动你的TabBarController和你的self.navigationController?.pushViewController也在推动TabBarController。

    解决方案: -

    1. 在导航控制器中嵌入DiscoveryNewsViewController
    2. 2.删除DiscoveryNewsViewController和tabbarController

      之间的segue连接

      enter image description here

答案 1 :(得分:0)

  1. 你不应该将标签栏推入导航控制器。因此,删除DiscoveryNewsViewController和TabBar之间的故事板中的segue
  2. 所以替换

    self.navigationController?.pushViewController(tabBar, animated: true)
    

    self.present(tabBar, animated: true, completion: nil)
    
    1. 由于您未在UI中刷新指定的图像和标签值,因此无法显示。要做到这一点,只需创建一个函数

      func refreshData() {     newsTitle.text = getNews     NewsImage.image = getImage }

    2. 在NewsViewController中

      并在

      之后立即调用它
      DVC.getImage=sneakersnews[indexPath.row].image
      DVC.getNews=sneakersnews[indexPath.row].news
      
      像这样

      DVC.refreshData()
      

答案 2 :(得分:0)

我看到了你的代码,并得到了问题,并进行了许多测试!

不是一个复杂的问题,但下次需要注意。

这是因为你将一个segue从你的单元格连接到一个TabbarController,当你选中单元格时,由于segue,它会自动转到tabbarController。

然后启动另一个tabbarController并传递数据然后呈现它。你在NewsViewController viewDidLoad中创建了一个断点,可以看到两次点击。

您的代码中还有许多其他问题, 在我看来,你只能使用segue传递数据,使代码稳定和可预测