2016-10-13 2 views
0

Я пытаюсь вывести изображение из «контроллера табличного представления» в отдельный вид, где изображение можно просмотреть «полноэкранным». Код, который я использовал, отлично работал до тех пор, пока я не обновился до Swift 3. Я читал об разворачивании необязательных значений, и я не могу понять, что это за ошибка.Ошибка при обновлении Swift 3 - Неожиданно найдено нуль при развертывании необязательного значения

Спасибо!

Строка кода, что ошибка на:

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

ОШИБКА: фатальная ошибка: неожиданно нашли ноль в то время как разворачивание необязательное значение

«полноэкранный» контроллер представления в которой эта ошибка происходит:

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

"контроллер TableView":

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

Благодарим за информацию. Перемещено в: переопределить func viewWillAppear (_ animated: Bool) { Detailimageview.sd_setImage (с: URL (строка: self.sentData1)), который появляется после viewDidLoad. По-прежнему получается такая же ошибка. – Miles

+0

Здесь что-то происходит, потому что проблема не в том коде, который вы опубликовали. Вы установили точку останова прямо перед возникновением ошибки, чтобы узнать, что такое фактическое значение 'sentData1'? – Dima

+0

У меня нет. Я не совсем уверен, как читать, что такое ценность. Я проверил свои выходы, и они связаны с – Miles