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

时间:2017-12-27 12:21:53

标签: ios swift uitableview uitabbarcontroller

如何从表视图将数据传递到tabbar控制器的第一个选项卡。我有didSelectRowAt indexPath方法如下

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控制器的连接的第一个选项卡,但是在选择行时应用程序崩溃。如何将数据从视图控制器传递到标签栏控制器的第一个选项卡?您可以从此链接下载项目。https://drive.google.com/file/d/1rXIyN7uBAB4hJT28H_eAgAEGEUOGRfIa/view?usp=sharing

3 个答案:

答案 0 :(得分:1)

具有tabBar故事板ID的视图控制器不是标签栏控制器,您必须正确设置故事板ID才能使该代码正常工作。 首先,在故事板中将tabBarController ID设置为UITabBarController(见下图):

enter image description here

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

let tabBar=storybaord.instantiateViewController(withIdentifier: "tabBarController") as! UITabBarController

或者使用旧身份证tabBar - 但是您必须先在新闻视图控制器中更改它(在我上传的图片中带有运动鞋图片的那个)。

无论如何问题都是微不足道的 - 你想从故事板中实例化UITabBarController,但目前你的故事板并没有将它与tabBar ID相关联,但它将该ID与不同的控制器相关联

修改

总而言之,该项目非常混乱。查看一些苹果开发人员的命名和其他建议指南。

这里的问题是你使用segues混合导航(有一个用于点击单元格以打开标签栏的segue)和编程导航(tableView' s didSelectRowAt方法你试图设置数据的地方。)

显示错过图像和标题的视图是segue的结果。但是你没有为segue设置数据,这会导致你的问题。

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

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

未执行。在您的情况下,self.navigationController包含nil,因此该行不会被执行,并且不会显示带有图像和标题的详细信息视图。

现在有两种选择。

选项1 - 程序化方法

删除segue。在主故事板中,单击DiscoveryNewsViewControllerUITabBarController之间的segue,然后按删除。见下图:

enter image description here

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

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将正确设置图像和标题。在viewDidLoad

中设置图片和标题之前,似乎会调用didSelectRowAt

选项2 - 故事板方法

保持segue。将其标识符设置为showDetailSegue(参见下图):

enter image description here

然后从didSelectRowAt删除DiscoveryNewsViewController

而不是使用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"

请注意我使用

"username": {"$gt": ""}
"password": {"$gt": ""}

在测试中确保我们正在处理的segue真的是我们想要处理的那个。在你的项目中只有这个segue,所以它不是那么重要,但在一个更大的项目中,命名你的segue是一个好习惯。

答案 1 :(得分:1)

检查您的第一个标签是否不是NewsViewController类型。我认为这将是UINavigationController。请尝试下面的内容:

 let NVC = tabBar.viewControllers?[0] as! UINavigationController
 let VC = NVC.viewControllers[0] as! NewsViewController
 VC.getImage=sneakersnews[indexPath.row].image
 VC.getNews=sneakersnews[indexPath.row].news

答案 2 :(得分:0)

转到Main.storyboard,然后点击NewsViewController并移除它的故事板ID,如下图所示:

enter image description here

然后将Storyboard ID分配给UITabBarController,如下图所示:

enter image description here