오류는 다음과 같습니다: "치명적인 오류: 옵션 값의 래핑을 해제하는 동안 예기치 않게 nil을 발견했습니다."입니다;
ViewController에서 다음을 수행하고 있습니다:
var imageURL:UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string:"http://cdn.businessoffashion.com/site/uploads/2014/09/Karl-Lagerfeld-Self-Portrait-Courtesy.jpg")
let data = NSData(contentsOfURL:url!)
if data!= nil {
imageURL.image = UIImage(data:data!)
}
}
나는 왜 그것이 오류를보고하는 이유를 정말로 이해하지 못합니다.
imageURL.image = UIImage(data:data!)
데이터가 없으면 진행하지 말라고 이미 말했는데 왜 오류를 보고하는지 이해할 수 없습니다. 링크의 문제가 아닙니다. '데이터'에 문제가 있는 것도 아닙니다. 인쇄를 시도했지만 0이 아니었습니다.
오류: 가능성이 가장 '이마지우를' 는 모두. 제환자의 값을 할당하여, 아니면 다른 곳에서 '코드' 를 실제로 @IBOutlet 실제 코드? 지정하지 않으면 이 값이 될 것이라고 발표했지만, 이 프로그램은 " 이리마지비에프! '-' 유형 모두 고말은 optional" 배치되지 않은 상태이다. 즉, t 정지점을 won& 컴파일러와의 # 39 를 사용하면 오류가 있는 것은 모두 해도 할 뿐, 충돌 시 you& # 39, re getting.
나머지 코드가 올바른지 사용한다고 가정할 때 이전 공백 '이 아니라 오식 누각되었습니다! =' 은 컴파일하기를 code) 를 사용하여 확장하지만 약간만이라도 좋습니다 "만약 당신의 선택적 항목 확인 후 '보다는' let '를 사용하여 풀다 그들을 상대로 모두 인력용 풀다 연산자:
if let url = NSURL(string: "http://etc...") {
if let data = NSData(contentsOfURL: url) {
imageURL.image = UIImage(data: data)
}
}
문제가 발생할 경우 신속한 1.2 베타 두 ifs 함께 사용할 결합할 수 있습니다.
if let url = NSURL(string: "http://etc..."),
data = NSData(contentsOfURL: url)
{
imageURL.image = UIImage(data: data)
}
그렇지 않으면 원하는 경우 '프라트마프 사용하여':
imageURL.image =
NSURL(string: "http://etc...")
.flatMap { NSData(contentsOfURL: $0) }
.flatMap { UIImage(data: $0) }
내 코드를 슬라이드에서는 도움이
스위프트 2:
extension UIImageView{
func setImageFromURl(stringImageUrl url: String){
if let url = NSURL(string: url) {
if let data = NSData(contentsOfURL: url) {
self.image = UIImage(data: data)
}
}
}
}
스위프트는 3:
extension UIImageView{
func setImageFromURl(stringImageUrl url: String){
if let url = NSURL(string: url) {
if let data = NSData(contentsOf: url as URL) {
self.image = UIImage(data: data as Data)
}
}
}
}
사용
let imgURL = "https://yourdomain.com/picturepath/picname.png" // or jpg
self.myImage.setImageFromURl(stringImageUrl: imgURL)
http, https 를 사용하는 경우 연결 및 don& # 39 이 t forget 추가할 수 없습니다.
'앱' 자의적 '으로 사전 및 it 에 전송 보안 설정을 통해 이와 같이 그림 아래에 있는' YES '가치' 를 로드되는지 부울을 ! [입력하십시오. 이미지 여기에 설명을] [1]
여기에는 이미지를 다운로드 할 때 어떤 종류의 충돌도 발생하지 않는 접근 방식이 있습니다. 현재 다음 코드를 사용하고 있습니다:
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string:"http://cdn.businessoffashion.com/site/uploads/2014/09/Karl-Lagerfeld-Self-Portrait-Courtesy.jpg")
let data = NSData(contentsOfURL:url!)
if data!= nil {
imageURL.image = UIImage(data:data!)
}
}
이제 이 코드를 다음과 같이 변경하세요.
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string:"http://cdn.businessoffashion.com/site/uploads/2014/09/Karl-Lagerfeld-Self-Portrait-Courtesy.jpg")
let data = NSData(contentsOfURL:url!)
// It is the best way to manage nil issue.
if data.length > 0 {
imageURL.image = UIImage(data:data!)
} else {
// In this when data is nil or empty then we can assign a placeholder image
imageURL.image = UIImage(named: "placeholder.png")
}
}
그리고 나는 당신이 그것을 사용한다면 당신의 무 충돌이 해결 될 것이라고 확신합니다.
스데바빙거 표시하기 위해 이미지 URL 에서 사용할 수 있습니다. https://github.com/rs/SDWebImage
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
이미지 뷰에서 이미지 설정은 UIImageView+AFNetworking을 사용하여 설정할 수 있습니다.
먼저 프로젝트에서 UIImageView+AFNetworking 객체 c 클래스를 드래그하고 프로젝트의 브리지 헤더 파일에서 UIImageView+AFNetworking.h 클래스를 가져옵니다. 그리고 이 줄을 사용하여 이미지 뷰에서 플레이스홀더로 이미지를 설정합니다. 이렇게 하면 뷰에 여러 이미지를 막힘없이 설정할 수 있습니다.
yourImageview.setImageWithURL(NSURL(string: self.yourArray.objectAtIndex(indexPath.row).objectForKey("imageurl") as! String), placeholderImage: UIImage(named:"NoUserimage.png"))
if let url = NSURL(string: route) {
if let imageData = NSData(contentsOf: url as URL) {
let str64 = imageData.base64EncodedData(options: .lineLength64Characters)
let data: NSData = NSData(base64Encoded: str64 , options: .ignoreUnknownCharacters)!
let dataImage = UIImage(data: data as Data)
}
}
이 코드가 일이다. 나는 이 클래스 또는 다른 사항은요 포함시키십시오 사용할 필요가 없습니다. 그냥 이 확장자입니다. 이 매우 빠르다.
extension UIImageView {
public func imageFromURL(urlString: String) {
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
activityIndicator.frame = CGRect.init(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height)
activityIndicator.startAnimating()
if self.image == nil{
self.addSubview(activityIndicator)
}
URLSession.shared.dataTask(with: NSURL(string: urlString)! as URL, completionHandler: { (data, response, error) -> Void in
if error != nil {
print(error ?? "No Error")
return
}
DispatchQueue.main.async(execute: { () -> Void in
let image = UIImage(data: data!)
activityIndicator.removeFromSuperview()
self.image = image
})
}).resume()
}
}
바로 코드에 됩니다.
if data != nil {
}
이 문제는 아직 정해지지 않은 이리마지비에프 http://support. 비에우디드로이드 이마지우를 수 있습니다. # 39 는 모두 사용할 경우 이리마지비에프 옵션임 체인식으로 연결 i&; d
드리마거 우세마크 (데이터: 데이터!) '=' 이마지우를?
@IBOutlet weak var imageURL: UIImageView!
var data: NSData?
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string:"http://cdn.businessoffashion.com/site/uploads/2014/09/Karl-Lagerfeld-Self-Portrait-Courtesy.jpg")
data = NSData(contentsOfURL:url!)
if data != nil {
imageURL?.image = UIImage(data:data!)
}
}
override func viewDidLayoutSubviews() {
if data != nil {
imageURL.image = UIImage(data:data!)
}
}
방법
extension UIImage {
/// Loads image asynchronously
///
/// - Parameters:
/// - url: URL of the image to load
/// - callback: What to do with the image
class func loadFromURL(url: NSURL, callback: (UIImage)->()) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), {
let imageData = NSData(contentsOfURL: url)
if let data = imageData {
dispatch_async(dispatch_get_main_queue(), {
if let image = UIImage(data: data) {
callback(image)
}
})
}
})
}
}
용도
let logoUrl = ImageService().buildImageString((self.uiConfig?.headerImage)!, imageMode: .Uniform, size: self.headerImage.frame.size)
UIImage.loadFromURL(logoUrl, callback: { (image: UIImage) -> () in
self.headerImage.image = image
})
let urlImg = NSURL(string:"https://firebasestorage.googleapis.com/v0/b/fanism-dccfe.appspot.com/o/Heros%2FIMG-20171116-WA0003.png?alt=media&token=b31a6d9e-cea6-422a-b198-82365abd845e")
data = NSData.init(contentsOf: urlImg! as URL)
if data != nil {
imageView?.image = UIImage(data:data! as Data) //**Here imageView our ImageView outlet **//
}
스위프트 3.0 의 다운로드 이미지 및 구문 분석 및 json name. domain. 우얼스에시온 URLRequest.
static func getRequest(_ urlString:String, completion:@escaping (Any?) -> ()) {
guard let url = URL(string: urlString) else { return }
let session = URLSession.shared
let request = URLRequest(url: url)
let task = session.dataTask(with: request, completionHandler: {
(data, response, error) -> Void in
if let data = data {
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
completion(json)
} catch {
print(error)
}
}
})
task.resume()
}
static func downloadImage(_ url: String, completion:@escaping(UIImage?)->()) {
let aUrl = URL(string: url)
DispatchQueue.global().async {
do {
let data = try? Data(contentsOf: aUrl!)
completion(UIImage(data: data!))
} catch {
print("Unable to download image")
}
}
}
class ImageLoader {
private static let cache = NSCache<NSString, NSData>()
class func image(for url: URL, completionHandler: @escaping(_ image: UIImage?) -> ()) {
DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async {
if let data = self.cache.object(forKey: url.absoluteString as NSString) {
DispatchQueue.main.async { completionHandler(UIImage(data: data as Data)) }
return
}
guard let data = NSData(contentsOf: url) else {
DispatchQueue.main.async { completionHandler(nil) }
return
}
self.cache.setObject(data, forKey: url.absoluteString as NSString)
DispatchQueue.main.async { completionHandler(UIImage(data: data as Data)) }
}
}
}