我有一个使用GitHub中的 presentr 制作的警报视图。我使用了一个简单的view controller
,它将覆盖当前的视图控制器。现在我有UIImage
中的UIlabel
和first view controller
等元素需要alert view controller
访问。但是,当我点击alert view controller
中的解开按钮以从第一个视图控制器访问来自uiimage
的{{1}}和text
时。这是代码。你能告诉我如何解决这个问题。我无法提取数据,因为我正在呈现视图控制器,而我试图访问的数据无论如何都太过分了。我一直收到这个错误"致命错误:在打开一个Optional值时意外发现nil"超时我点击uilabel
中的保存按钮。
alertviewcontroller
答案 0 :(得分:1)
您犯的最大错误是您正在创建firstviewcontroller
的新实例,而不仅仅是访问当前的实例。
class alertviewcontroller: UIViewController{
@IBAction func Save(_ sender: Any) {
dismiss(animated: true, completion: nil)
let storyboard: UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
let firstViewController: firstviewcontroller = storyboard.instantiateViewController(withIdentifier: "firstviewcontroller") as! firstviewcontroller // This is the mistake
if let image = firstViewController.Image {
imageview.image = image
}
if let label = firstViewController.Label {
label.text = Label.text
}
}
}
您需要做的是访问presentingViewController
,因为您使用alertviewcontroller
函数提交了present
代码看起来像这样
class alertviewcontroller: UIViewController{
@IBAction func Save(_ sender: Any) {
dismiss(animated: true, completion: nil)
let storyboard: UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
// NOTE: only do implicit unwrapping `as!` if you're sure that the value you're unwrapping is not `nil` or it is of the correct `data type` cause it might cause your app to crash
let firstViewController: firstviewcontroller = self.presentingViewController as! firstviewcontroller
if let image = firstViewController.Image {
imageview.image = image
}
if let label = firstViewController.Label {
label.text = Label.text
}
}
}
提示:请查看Swift编码指南,因为您对methods
,variables
和classes
的命名存在一些小错误。
答案 1 :(得分:0)
我可能错了,但在审核完你的代码后,我发现了这个混乱的陈述
let firstViewController: firstviewcontroller = storyboard.instantiateViewController(withIdentifier: "firstviewcontroller") as! firstviewcontroller
在此语句中,您正在创建firstviewcontroller
的新实例,而不访问已创建的firstviewcontroller
实例。
接下来,你说
我使用了一个简单的视图控制器,它将覆盖当前的视图 查看控制器
所以我假设你没有出现或推送alertviewcontroller
当前的viewController,就我的行为而言,我建议您使用以下解决方案
在alertviewcontroller
中使用此方法获取topViewController的实例
class func topViewController(base: UIViewController? = (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController) -> UIViewController? {
if let nav = base as? UINavigationController {
return topViewController(base: nav.visibleViewController)
}
if let tab = base as? UITabBarController {
if let selected = tab.selectedViewController {
return topViewController(base: selected)
}
}
if let presented = base?.presentedViewController {
return topViewController(base: presented)
}
return base
}
然后您可以将数据从alertviewcontroller
传输到topViewController。
alertviewcontroller
传递到firstviewcontroller
。