Ios Swift 3更新中出错-在展开可选值时意外发现nil

Ios Swift 3更新中出错-在展开可选值时意外发现nil,ios,swift,uitableview,segue,swift3,Ios,Swift,Uitableview,Segue,Swift3,我正在尝试将一个图像从“tableview控制器”分割到一个单独的视图中,在这个视图中可以“全屏”查看图像。在我升级到Swift 3之前,我使用的代码工作得非常好。我一直在阅读有关展开可选值的内容,但我不知道这里的错误是什么 谢谢 错误所在的代码行: Detailimageview.sd_setImage(with: URL(string:self.sentData1)) 错误:致命错误:在展开可选值时意外发现nil 发生此错误的“全屏”视图控制器: import UIKit cla

我正在尝试将一个图像从“tableview控制器”分割到一个单独的视图中,在这个视图中可以“全屏”查看图像。在我升级到Swift 3之前,我使用的代码工作得非常好。我一直在阅读有关展开可选值的内容,但我不知道这里的错误是什么

谢谢

错误所在的代码行:

    Detailimageview.sd_setImage(with: URL(string:self.sentData1))
错误:致命错误:在展开可选值时意外发现nil

发生此错误的“全屏”视图控制器:

import UIKit

class PhotoView: UIViewController, UIPopoverPresentationControllerDelegate, UIScrollViewDelegate {

@IBOutlet weak var containerView: UIView!

@IBOutlet weak var scrollView: UIScrollView!

@IBOutlet weak var Detailimageview: UIImageView!


var sentData1:String!


func scrollViewDidZoom(_ scrollView: UIScrollView) {
    let imageViewSize = Detailimageview.frame.size
    let scrollViewSize = scrollView.bounds.size

    let verticalPadding = imageViewSize.height < scrollViewSize.height ? (scrollViewSize.height - imageViewSize.height) / 2 : 0
    let horizontalPadding = imageViewSize.width < scrollViewSize.width ? (scrollViewSize.width - imageViewSize.width) / 2 : 0

    scrollView.contentInset = UIEdgeInsets(top: verticalPadding, left: horizontalPadding, bottom: verticalPadding, right: horizontalPadding)
}

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
    return Detailimageview
}

func setZoomScale() {
    let imageViewSize = Detailimageview.bounds.size
    let scrollViewSize = scrollView.bounds.size
    let widthScale = scrollViewSize.width / imageViewSize.width
    let heightScale = scrollViewSize.height / imageViewSize.height

    scrollView.minimumZoomScale = min(widthScale, heightScale)
    scrollView.zoomScale = 1.0


}

override func viewWillLayoutSubviews() {
    setZoomScale()
}

override func viewDidLoad() {
    super.viewDidLoad()


    Detailimageview.sd_setImage(with: URL(string:self.sentData1))


    // Do any additional setup after loading the view.

    setZoomScale()
}

 func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {


}


func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return containerView

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func DismissView(_ sender: AnyObject) {

    self.dismiss(animated: true, completion: nil)
}

@IBAction func showPopup(_ sender: AnyObject) {

    let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sbPopUpID") as! PopUpViewController
    self.addChildViewController(popOverVC)
    popOverVC.view.frame = self.view.frame
    self.view.addSubview(popOverVC.view)
    popOverVC.didMove(toParentViewController: self)
}

override var prefersStatusBarHidden: Bool {
    get {
        return true
    }
}
import UIKit

class ListViewController: UITableViewController {

var imageURLs = [String]()




let cellVenue = ["Example Venue","Example Venue1","Example Venue2","Example Venue3","Example Venue4","Example Venue5"]

let cellLocation = ["Example Venue, Location","Example Venue, Location1","Example Venue, Location2","Example Venue, Location3","Example Venue, Location4","Example Venue, Location5"]

let cellDate = ["Example Date, 1970","Example Date, 1971","Example Date, 1972","Example Date, 1973","Example Date, 1974","January 1st, 1975"]



override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

}

override func viewDidLoad() {
    super.viewDidLoad()


    imageURLs = ["https://i.imgur.com/bSfVe7l.jpg","https://i.imgur.com/vRhhNFj.jpg","https://i.imgur.com/bSfVe7l.jpg","https://i.imgur.com/vRhhNFj.jpg","https://i.imgur.com/bSfVe7l.jpg"]

    self.tableView.separatorStyle = .none

    // tableView.indicatorStyle = UIScrollViewIndicatorStyle.white

    self.view.backgroundColor = UIColor.black

    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

    navigationController!.navigationBar.barTintColor = UIColor.black




}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return imageURLs.count

}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell: ListViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ListViewCell

    let imageView = cell.viewWithTag(1) as! UIImageView

    imageView.sd_setImage(with: URL(string: imageURLs[indexPath.row]))

    imageView.sd_setHighlightedImage(with: URL(string: imageURLs[indexPath.row]), options: [.continueInBackground, .progressiveDownload, .avoidAutoSetImage])

    cell.cellVenue.text = cellVenue[indexPath.row]

    cell.cellLocation.text = cellLocation[indexPath.row]

    cell.cellDate.text = cellDate[indexPath.row]


    return cell

}

 func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {


    if (segue.identifier == "DetailView")  {
        // segue.destination is correct, xcode keeps switching it to segue.description
        let VC = segue.destination as! PhotoView
        if let indexpath = self.tableView.indexPathForSelectedRow {

            let Imageview = imageURLs[indexpath.row] as String
            VC.sentData1 = Imageview
        }
    }



}

override var prefersStatusBarHidden: Bool {
    get {
        return true
    }
}

看起来这是一个视图生命周期问题<在调用
prepareforsgue
之前或至少在父控制器上完成之前,调用子控制器上的code>viewDidLoad。环顾四周,我看到了关于这是否应该发生的相互矛盾的信息,我通常不使用故事板,所以我自己也不确定。在任何情况下,一个简单的解决方法就是将图像设置代码移出
viewdiload
,进入
viewwillbeen
。URL肯定应该在该点设置,您的可选内容将成功展开。

看起来这是视图生命周期问题<在调用
prepareforsgue
之前或至少在父控制器上完成之前,调用子控制器上的code>viewDidLoad。环顾四周,我看到了关于这是否应该发生的相互矛盾的信息,我通常不使用故事板,所以我自己也不确定。在任何情况下,一个简单的解决方法就是将图像设置代码移出
viewdiload
,进入
viewwillbeen
。URL肯定应该在该点设置,您的可选内容将成功展开。

感谢您提供的信息。将其移动到:override func viewwillbeen(u动画:Bool){Detailimageview.sd_setImage(with:URL(string:self.sentData1))这是在viewDidLoad之后出现的。仍然会出现相同的错误。因为问题不在您发布的代码中,所以这里还发生了其他问题。您是否在错误发生之前设置了断点以查看
sentData1
的实际值是什么?我没有。我不太确定如何读取该值。我已签出我的lets和他们的链接支持是一个关于使用Xcode/Swift进行基本调试的好文章:感谢您提供的信息。将其移动到:override func viewwillbeen(u animated:Bool){Detailimageview.sd_setImage(with:URL(string:self.sentData1))这是在viewDidLoad之后出现的。仍然会出现相同的错误。因为问题不在您发布的代码中,所以这里还发生了其他问题。您是否在错误发生之前设置了断点以查看
sentData1
的实际值是什么?我没有。我不太确定如何读取该值。我已签出我的lets及其链接支持是使用Xcode/Swift进行基本调试的一个好方法: