【问题标题】:how to pass the data to first tab of the tabbarcontroller如何将数据传递到 tabbarcontroller 的第一个选项卡
【发布时间】:2018-06-08 02:17:15
【问题描述】:

如何将数据从表格视图传递到选项卡控制器的第一个选项卡。我有 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)

        }

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

【问题讨论】:

  • 标识符是否正确?
  • 您没有将 Storyboard Id 设置为 UITabBarController。
  • 我已经更新了我的答案来解释你的项目出了什么问题。

标签: ios swift uitableview uitabbarcontroller


【解决方案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

【讨论】:

  • 程序在第一行崩溃,没有任何错误描述。让 NVC = tabBar.viewControllers?[0] 为! UINavigationController.
【解决方案2】:

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

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

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

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

无论如何,问题都很简单——您想从情节提要中实例化UITabBarController,但目前您的情节提要并未将其与tabBar ID 关联,但它将该ID 与不同的控制器关联。

编辑

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

这里的问题是您正在混合使用 segues 导航(有一个用于点击单元格以打开标签栏的 segue)和编程导航(tableView's didSelectRowAt数据)。

所呈现的缺少图像和标题的视图是 segue 的结果。但是您没有为 segue 设置数据,这会导致您的问题。

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

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

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

你现在有两个选择。

选项 1 - 程序化方法

删除转场。在主情节提要中,单击DiscoveryNewsViewControllerUITabBarController 之间的转场,然后按删除。见下图:

然后在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 - 故事板方法

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

然后从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"

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

【讨论】:

  • 它没有显示我从视图控制器传递到标签栏控制器的 ist 选项卡的新闻标题和图像?这就是问题
  • @ajadka 我更新的答案有帮助吗?如果可以,请问您能接受吗?
【解决方案3】:

转到您的Main.storyboard 然后点击NewsViewController 并删除它的Storyboard ID,如下图所示:

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

【讨论】:

  • 它没有显示我从视图控制器传递到标签栏控制器的 ist 选项卡的新闻标题和图像?这就是问题
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多