Ios 如何将数据传递到tabbarcontroller的第一个选项卡

Ios 如何将数据传递到tabbarcontroller的第一个选项卡,ios,swift,uitableview,uitabbarcontroller,Ios,Swift,Uitableview,Uitabbarcontroller,如何将数据从表视图传递到tabbar控制器的第一个选项卡 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let storybaord=UIStoryboard(name: "Main", bundle: nil) ///App crash / let tabBar=storybaord.instantiateViewController(w

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

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            let storybaord=UIStoryboard(name: "Main", bundle: nil)
         ///App crash /  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)

        }

我想将图像和新闻从视图控制器传递到已连接的tabbar控制器的第一个选项卡,但应用程序在选择行时崩溃。如何将数据从视图控制器传递到tabbar控制器的第一个选项卡?您可以从此链接下载项目。

具有
选项卡栏的视图控制器
序列图像板ID不是选项卡栏控制器,您必须正确设置序列图像板ID才能使代码正常工作。 首先,在故事板中,将
tabBarController
id设置为
UITabBarController
(参见下图):

然后,将崩溃代码更改为:

let tabBar=storybaord.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController
或者使用旧ID
选项卡栏
——但您必须首先在新闻视图控制器(我上传的图片中带有运动鞋图像的控制器)中更改它

不管怎么说,这个问题并不重要——您希望从情节提要中实例化
UITabBarController
,但当前情节提要没有将其与
tabBar
ID关联,而是将该ID与另一个控制器关联

编辑

总之,这个项目非常混乱。查看一些苹果开发者的命名指南和其他建议

这里的问题是,您正在混合使用segue(有一个segue用于点击单元格以打开选项卡栏)和编程导航(您试图设置数据的
tableView
didSelectRowAt
方法)

未显示图像和标题的视图是segue的结果。但是您没有为segue设置数据,这导致了您的问题

您向我们展示的编程代码确实可以执行,但毫无用处。应该弹出详细视图的
DiscoveryNewsViewController
未嵌入
UINavigationController
中。因此,以下行:

self.navigationController?.pushViewController(tabBar, animated: true)
没有执行。在您的示例中,
self.navigationController
包含nil,因此不会执行该行,也不会显示带有图像和标题的详细视图

你现在有两个选择

选项1-计划方法

删除segue。在主情节提要中,单击
DiscoveryNewsViewController
UITabBarController
之间的分段,然后按delete键。请参见下图:

然后在
DiscoveryNewsViewController
中使用以下
didSelectRowAt
实现来显示详细信息:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let storybaord=UIStoryboard(name: "Main", bundle: nil)
    let tabBar=storybaord.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController
    let DVC = tabBar.viewControllers?[0] as! NewsViewController
    tabBar.selectedIndex = 0

    DVC.getImage=self.sneakersnews[indexPath.row].image
    DVC.getNews=self.sneakersnews[indexPath.row].news

    self.present(tabBar, animated: true, completion: nil)
}
请注意,我没有使用
self.navigationController?.pushViewController
,而是使用
self.present

同时将
NewsViewController
修改为:

class NewsViewController: UIViewController {

    @IBOutlet weak var newsTitle: UILabel!

    @IBOutlet weak var NewsImage: UIImageView!

    var getNews=String() {
        didSet {
            newsTitle.text = getNews
        }
    }

    var getImage=UIImage() {
        didSet {
            NewsImage.image = getImage
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}
在属性上使用
didSet
将正确设置图像和标题。在
didSelectRowAt
中设置图像和标题之前,似乎会调用
viewDidLoad

选项2-故事板方法

保持沉默。将其标识符设置为
showtailsegue
(参见下图):

然后从
DiscoveryNewsViewController
中删除
didSelectRowAt

而不是使用
prepare(for:sender:)
在显示前配置
NewsViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetailSegue",
        let tabBar = segue.destination as? UITabBarController,
        let DVC = tabBar.viewControllers?[0] as? NewsViewController,
        let selectedRow = DiscoveryNewsTableView.indexPathForSelectedRow {

        tabBar.selectedIndex = 0

        DVC.getImage=self.sneakersnews[selectedRow.row].image
        DVC.getNews=self.sneakersnews[selectedRow.row].news
    }
}
注意,我正在使用

segue.identifier == "showDetailSegue"

在测试中,确保我们正在处理的序列确实是我们想要处理的序列。在您的项目中只有这个序列,所以它不是很重要,但在更大的项目中,命名序列是一个很好的做法。

带有
选项卡栏
序列图像板ID的视图控制器不是选项卡栏控制器,您必须正确设置序列图像板ID才能使代码正常工作。 首先,在故事板中,将
tabBarController
id设置为
UITabBarController
(参见下图):

然后,将崩溃代码更改为:

let tabBar=storybaord.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController
或者使用旧ID
选项卡栏
——但您必须首先在新闻视图控制器(我上传的图片中带有运动鞋图像的控制器)中更改它

不管怎么说,这个问题并不重要——您希望从情节提要中实例化
UITabBarController
,但当前情节提要没有将其与
tabBar
ID关联,而是将该ID与另一个控制器关联

编辑

总之,这个项目非常混乱。查看一些苹果开发者的命名指南和其他建议

这里的问题是,您正在混合使用segue(有一个segue用于点击单元格以打开选项卡栏)和编程导航(您试图设置数据的
tableView
didSelectRowAt
方法)

未显示图像和标题的视图是segue的结果。但是您没有为segue设置数据,这导致了您的问题

您向我们展示的编程代码确实可以执行,但毫无用处。应该弹出详细视图的
DiscoveryNewsViewController
未嵌入
UINavigationController
中。因此,以下行:

self.navigationController?.pushViewController(tabBar, animated: true)
没有执行。在您的示例中,
self.navigationController
包含nil,因此不会执行该行,也不会显示带有图像和标题的详细视图

你现在有两个选择

选项1-计划方法

删除segue。在主情节提要中,单击
DiscoveryNewsViewController
UITabBarController
之间的分段,然后按delete键。请参见下图:

然后在
DiscoveryNewsViewController
中使用以下
didSelectRowAt
实现来显示详细信息:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let storybaord=UIStoryboard(name: "Main", bundle: nil)
    let tabBar=storybaord.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController
    let DVC = tabBar.viewControllers?[0] as! NewsViewController
    tabBar.selectedIndex = 0

    DVC.getImage=self.sneakersnews[indexPath.row].image
    DVC.getNews=self.sneakersnews[indexPath.row].news

    self.present(tabBar, animated: true, completion: nil)
}
请注意,我没有使用
self.navigationController?.p