ios - CollectionView Segue 在接收 ViewController 时发现 nil
问题描述
我有一个集合视图,它在其索引中选择一个项目并执行到下一个 ViewController 的 segue。当呈现下一个 ViewController 时,我的对象的值为nil
.
这是collectionView中的调用:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let adViewVC = storyboard?.instantiateViewController(withIdentifier: adViewPageID) as? AdViewPageVC else {return}
let adChoice = adArray[indexPath.row]
adViewVC.advertisement = adChoice
performSegue(withIdentifier: adViewPageSegue, sender: self)
}
请注意,保护语句正在执行,如果我从 adArray 打印一个值,它在此函数中具有值。
在我执行打开正确 ViewController 的 segue 之后,广告对象始终为零。
var advertisement : Advertisement!
override func viewDidLoad() {
super.viewDidLoad()
let title = advertisement.title
print(title)
}
即使我可以didSelectItem
在集合视图的函数分配期间看到它具有值,这也永远不会获得对象的值。
我在这里想念什么?
解决方案
当用户点击 collectionViewCell 时,应用程序应该执行 segueindexPath
作为发送者:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
performSegue(withIdentifier: adViewPageSegue, sender: indexPath)
}
并准备好方法中所有必要的东西prepare(for:sender:)
。而且您不必从情节提要中初始化 viewController。segue.destination
足够的。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier {
if identifier == adViewPageSegue {
guard let adViewVC = segue.destination as? AdViewPageVC else {return}
let indexPath = sender as! IndexPath
let adChoice = adArray[indexPath.row]
adViewVC.advertisement = adChoice
}
}
}
推荐阅读
- python - 如何通过 Python 上的 Bitmex Websocket Api 接收实时数据?
- keycloak - Red Hat SSO 7.3.0.GA 的 Keycloak API 调用依赖项
- http - 戈朗。如何自动授权我的应用访问 spotify API?
- java - Intellij 中的 AWSToolkit,环境变量不起作用
- javascript - 使用 Jest 对仅在函数存在时调用函数的 JavaScript 进行单元测试
- python - 无法摆脱使用 asyncio 时出现的一些错误页面
- php - 使用 htaccess 重定向到 https,但不使用 XAMPP 进行开发
- c# - 我可以对 Azure Cosmos 中的 DateTimeOffset 序列化对象使用 DateTimePart 函数吗?
- c# - 无法将 Json 字符串反序列化为 .NET 对象,但反序列化后对象为空
- c# - 使用 Nodejs/Electron 处理 Windows COM 对象