从另一个视图控制器访问元素出现零

时间:2017-05-18 02:51:27

标签: ios iphone swift xcode swift3

我有一个使用GitHub中的 presentr 制作的警报视图。我使用了一个简单的view controller,它将覆盖当前的视图控制器。现在我有UIImage中的UIlabelfirst view controller等元素需要alert view controller访问。但是,当我点击alert view controller中的解开按钮以从第一个视图控制器访问来自uiimage的{​​{1}}和text时。这是代码。你能告诉我如何解决这个问题。我无法提取数据,因为我正在呈现视图控制器,而我试图访问的数据无论如何都太过分了。我一直收到这个错误"致命错误:在打开一个Optional值时意外发现nil"超时我点击uilabel中的保存按钮。

alertviewcontroller

2 个答案:

答案 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编码指南,因为您对methodsvariablesclasses的命名存在一些小错误。

答案 1 :(得分:0)

我可能错了,但在审核完你的代码后,我发现了这个混乱的陈述

let firstViewController: firstviewcontroller = storyboard.instantiateViewController(withIdentifier: "firstviewcontroller") as! firstviewcontroller

在此语句中,您正在创建firstviewcontroller的新实例,而不访问已创建的firstviewcontroller实例。

接下来,你说

  

我使用了一个简单的视图控制器,它将覆盖当前的视图   查看控制器

所以我假设你没有出现或推送alertviewcontroller当前的viewController,就我的行为而言,我建议您使用以下解决方案

  1. 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
    }
    
  2. 然后您可以将数据从alertviewcontroller传输到topViewController。

    1. 下一个解决方案是,您可以使用委托将值从alertviewcontroller传递到firstviewcontroller