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】:
看起来eventPic
是UIImageView
作为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的主要内容,如果未能解决你的问题,请参考以下文章
UIImage 在 Swift 中的 UIImagePickerController 之后为 nil
如何在 swift 中将 UIImage 中的 PDF 放入 PDFView 中?