2016-10-13 18 views
0

"テーブルビューコントローラー"から別のビューに画像を "全画面"で見ることを試みています。私が使用していたコードは、Swift 3にアップデートするまでうまくいった。私はオプションの値をアンラップすることについて読んできたが、ここで何がエラーであるのか分からない。Swift 3のアップデートでエラーが発生しました - オプションの値をアンラッピングしている間に予期せずnilが見つかりました

ありがとうございます!

エラーが上にあることを、コードの行:

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

ERROR:致命的なエラー:「フルスクリーン」ビューコントローラ内

任意の値をアンラップしながら、予想外にゼロを見つけましたこれは、このエラーが起こっている:

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 
    } 
} 

答えて

2

に見えます。子コントローラのviewDidLoadは、prepareForSegueが呼び出される前、または少なくとも親で完了する前に呼び出されています。周りを見回すと、これが起こるはずであるかどうかについての情報が矛盾していることがわかります。通常はストーリーボードを使用しないので、自分自身が肯定的ではありません。いずれにせよ、あなたの場合の簡単な修正は、画像設定コードをviewDidLoadからviewWillAppearに移動することです。そのポイントでURLを確実に設定する必要があり、オプションのアンラップが正常に行われます。

+0

ありがとうございました。 viewDidLoadの後に来るDetailimageview.sd_setImage(with:URL(文字列:self.sentData1))をオーバーライドしました:override func viewWillAppear(_ animated:Bool){ まだ同じエラーが発生しています。 – Miles

+0

投稿したコードに問題がないため、ここで何か他のことが起こっています。エラーが発生する前にブレークポイントを設定して、 'sentData1'の実際の値を確認しましたか? – Dima

+0

私はしていません。私は値が何であるかをどのように読むかについてはあまりよく分かりません。私はアウトレットをチェックして、彼らはリンクアップしています – Miles

関連する問題