swift - 第二个控制器没有接收到数据
问题描述
我有两个控制器,我试图将数据从第一个传递到第二个,但它根本没有接收到。我尝试将数据作为属性传递并使用 prepareForSegue,但不知何故,第二个视图控制器没有从第一个控制器接收值。第一个 Controller 称为MainViewController,第二个是FactViewController。我在下面使用这个扩展,因为我在我的第一个屏幕中使用了 contentView。当我从内容视图中点击一个单元格时,我想执行数据传输。factValue
常量正常接收我想要的数据,但是当我将其传输到第二个控制器(FactViewController)时,它不会传输。
使用财产方式:
extension MainViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let factValue = facts!.result[indexPath.row].value
let fvc = FactViewController()
fvc.receivedValue = factValue
performSegue(withIdentifier: "segueMainscAndFactsc", sender: nil)
}
使用 Prepreforsegue 方式:
extension MainViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let factValue = facts!.result[indexPath.row].value
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
let destinationVC = segue.destination as! FactViewController
destinationVC.receivedValue = factValue
}
}
}
这是我的第二个视图控制器(FactViewController):
class FactViewController: UIViewController {
var receivedValue: String = ""
override func viewDidLoad() {
super.viewDidLoad()
print(receivedValue)
}
}
receivedValue
当我在里面的第二个控制器中打印变量时,viewDidLoad
它仍然打印一个空的String
. 有没有人有解决它的建议?
解决方案
嗯,第一种方式很明显是无效的。你说let fvc = FactViewController()
并设置了它receivedValue
,但是你把它扔掉了,而是触发了一个涉及完全不同的FactViewController 的 segue。因此,您设置的那个receivedValue
不是其视图被加载的那个。
第二种方法也是无效的,因为你prepareForSegue
被埋在另一个函数中(并且签名错误),所以它甚至不会被调用。
你真正想要的更像是这样的:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
performSegue(withIdentifier: "segueMainscAndFactsc", sender: nil)
}
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let destinationVC = segue.destination as! FactViewController
let factValue = // ???
destinationVC.receivedValue = factValue
}
请注意,我已经更正了您的prepare
签名。
这里的困难部分是弄清楚factValue
应该是什么。但就目前而言,只需设置一些任意值来说服自己这行得通!然后,您可以努力获取正确的值以移交给目标 vc。
推荐阅读
- asp.net - 如何将我的 ASP.NET 应用程序与 Epicor ERP 连接?
- matplotlib - 根据 x 值在 axhline 中指定 xmax
- php - 使用 xampp 访问 localhost 上的 html/php 文件时出现错误 404
- r - 从 R 中的 dlmSvd2var 函数(dlm 包)获得的 mse 矩阵是什么?
- flutter - 未来建造者状态
- >#a0d90):I/flutter(20935):RangeError(索引):无效值:有效值范围为空:0
- java - 使用 Mockito 模拟抽象类中的静态方法
- vhdl - VHDL 端口外部名称和过程模式
- javascript - react-native modal 官方示例不适用于 react-native-web,我该如何解决?
- django - Django计算ORM中行之间的差异
- php - Laravel - 将 RAW 查询转换为 Eloquent 查询(更新查询)