我是iOS新手。我将收集一系列产品。每个产品的最小详细信息为0至15。每当我们单击一个产品时,该产品的相关详细信息都应显示在其他产品上视图控制器。如果该产品有5个详细信息,则仅应显示5个详细信息。其余的详细信息字段的高度应变为0。这是我的要求。我尝试了此操作,但出现了类似“线程1:信号SIGABRT”的错误。控制台“无法将类型'NSNull'(0x107e57de0)的值强制转换为'NSString'(0x106ef25d8)。 2019-02-15 11:28:51.808090 + 0530 PlanetZoomApp [6777:85237]无法将类型'NSNull'(0x107e57de0)的值强制转换为'NSString'(0x106ef25d8)。” 如果有人帮助我,那就太好了。谢谢。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let lmp = storyboard.instantiateViewController(withIdentifier: "LocatemypicViewController") as!
if let desc:String = (dictobj["description"] as! String){
print(desc)
lmp.des = desc
}else{
lmp.descriptionviewheight.constant=0
}
self.navigationController?.pushViewController(lmp, animated: true)
}
答案 0 :(得分:0)
在使用if let时,通常不应使用强制转换! ,第二个问题是在调用viewDidLoad之前,约束没有初始化。因此您可以将值保存在某个地方,并在内部LocatemypicViewController viewDidLoad中使用它。
总体而言,我建议您将dictobj [“ description”]传递给下一个视图控制器,并在viewDidLoad内部执行逻辑,并避免在父视图控制器上执行另一个视图的逻辑。
class ViewController1:UIViewController {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let lmp = storyboard.instantiateViewController(withIdentifier: "LocatemypicViewController") as!
if let desc:String = (dictobj["description"] as? String){
print(desc)
lmp.des = desc
}else{
lmp._descriptionviewheight = 0
}
self.navigationController?.pushViewController(lmp, animated: true)
}
}
class LocatemypicViewController:UIViewController {
var _descriptionviewheight = 0
override func viewDidLoad() {
descriptionviewheight.constant = _descriptionviewheight
}
}