Ios 如何将数据传递到tabbarcontroller的第一个选项卡
如何将数据从表视图传递到tabbar控制器的第一个选项卡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
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