UIImage 在 Swift 中的 UIImagePickerController 之后为 nil

Posted

技术标签:

【中文标题】UIImage 在 Swift 中的 UIImagePickerController 之后为 nil【英文标题】:UIImage is nil after UIImagePickerController in Swift 【发布时间】:2017-01-19 23:02:15 【问题描述】:

当打印出 iImage 的值时,它显示:“ size 3024, 4032orientation 3 scale 1.000000”,但随后出现错误:“致命错误:意外发现nil 同时在下一行展开可选值”。我刚刚得到的图像怎么可能是零?

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
        let iImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        print(iImage)
        createEvent(iImage)//where it is saved to cloudkit with location and title
        EventPageViewController().eventPic.image = iImage
        self.dismiss(animated: true, completion: nil);
    

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) 

        let eventPageViewController:EventPageViewController = storyboard?.instantiateViewController(withIdentifier: "EventPage") as! EventPageViewController
        self.present(eventPageViewController, animated: true, completion: nil)
    

func loadEvent(_ completion: @escaping (_ error:NSError?, _ records:[CKRecord]?) -> Void)
    
        let date = NSDate(timeInterval: -60.0 * 180, since: NSDate() as Date)
        let predicate = NSPredicate(format: "creationDate > %@", date)
        let query = CKQuery(recordType: "Event", predicate: predicate)
        CKContainer.default().publicCloudDatabase.perform(query, inZoneWith: nil)
            (records, error) in
            if error != nil 
                print("error fetching events: \(error)")
                completion(error as NSError?, nil)
             else 
                print("found events")
                completion(nil, records)
                guard let records = records else 
                    return
                
                for record in records
                
                    self.drawEvents(record["LocationF"] as! CLLocation, title1: record["StringF"] as! String)

                    if let asset = record["Picture"] as? CKAsset,
                        let data = NSData(contentsOf: asset.fileURL),
                        let image1 = UIImage(data: data as Data)
                    
                        //EventPageViewController().eventPic.image = image1
                    
                
            
        
    

func drawEvents(_ loc: CLLocation, title1: String)
    
        mapView.delegate = self
        let center = CLLocationCoordinate2D(latitude: loc.coordinate.latitude, longitude: loc.coordinate.longitude)
        let lat: CLLocationDegrees = center.latitude
        let long: CLLocationDegrees = center.longitude
        self.pointAnnotation1 = MKPointAnnotation()
        self.pointAnnotation1.title = title1
        self.pointAnnotation1.subtitle = "Event"
        self.pointAnnotation1.coordinate = CLLocationCoordinate2D(latitude: lat, longitude: long)

        self.pinAnnotationView = MKPinAnnotationView(annotation: self.pointAnnotation1, reuseIdentifier: nil)
        self.mapView.addAnnotation(self.pinAnnotationView.annotation!)
    

【问题讨论】:

您确定错误来自 iImage 吗?你确定 eventPic 不为零吗? 【参考方案1】:

这是因为您在 EventPageViewController() 处创建了 ViewController 的新实例。如果这个委托方法在EventPageViewController,你可以直接调用self.eventPic.image = iImage

【讨论】:

它不是当前的 ViewController。它是一个 ViewController,当单击注释上的信息按钮时出现 @Steve 那么这个委托方法是如何被触发的呢?你EventPageViewController的总体布局是什么? FirstViewController 在用户单击按钮时打开相机。上面没有包含另一行代码,它调用了一个执行 pin 的方法。单击注释上的信息按钮时,它会打开 EventPageViewController(我想要图片所在的位置)。 所有这些也都保存到 cloudkit 以便其他用户可以下载 pin。我需要每个引脚都有自己的 EventPageViewController 实例,以便它们每个都有自己不同的图片。 @Pratik Patel @Steve 因此,您需要将图像传回FirstViewController,然后通过segue 或任何您必须打开EventPageViewController 的机制将其传递。【参考方案2】:

看起来eventPicUIImageView 作为IBOutlet。所以你的EventPageViewController 实例还没有完成加载它的视图和连接出口。

EventPageViewController 中应该有一个 UIImage 属性。

class EventPageViewController 
  var eventImage: UIImage?
  @IBOutlet var eventPic:UIImageView! //you should have better name like eventImageView

  func viewDidLoad() 
    super.viewDidLoad()
    eventPic?.image = eventImage
    ///rest goes here
  

所以从你的选择器委托中你可以像这样访问:

let eventPageViewController = EventPageViewController()
eventPageViewController.eventImage = iImage

希望这会有所帮助。

【讨论】:

以上是关于UIImage 在 Swift 中的 UIImagePickerController 之后为 nil的主要内容,如果未能解决你的问题,请参考以下文章

Swift中的像素数组到UIImage

Swift:在表格视图中显示 UIImage 数组中的图像

UIImage 在 Swift 中的 UIImagePickerController 之后为 nil

如何在 swift 中将 UIImage 中的 PDF 放入 PDFView 中?

swift中的UIImage,CIImage和CGImage有啥区别[重复]

如何在objective-c中使UIImage为NULL