如何从表视图将数据传递到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
答案 0 :(得分:1)
具有tabBar
故事板ID的视图控制器不是标签栏控制器,您必须正确设置故事板ID才能使该代码正常工作。
首先,在故事板中将tabBarController
ID设置为UITabBarController
(见下图):
然后,将崩溃代码更改为:
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。在主故事板中,单击DiscoveryNewsViewController
和UITabBarController
之间的segue,然后按删除。见下图:
然后在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
(参见下图):
然后从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)