2015-10-24 1 views
0

Je rencontre un problème avec mon code. Je ne peux pas sembler créer un CGImageSource/CGImageSourceRef, cependant chaque repo que je vois utilise exactement la même méthode. J'ai testé pour voir si l'objet de données contient le gif et c'est le cas. J'ai donc isolé cette erreur à la fonction CGImageSourceCreateWithData et je ne sais pas comment y remédier. Toute aide serait appréciée.CGImageSourceCreateWithData continue de générer des erreurs

est ici l'erreur:

warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.

Il échoue après spécifiquement cette fonction:

var imgSource = CGImageSourceCreateWithData(data, nil) 

Voici mon code simple qui échoue après:

import UIKit 
import ImageIO 
import MobileCoreServices 
import AVFoundation  

class LCGIFImage: UIImage { 

//MARK: Initializers 

convenience override init?(contentsOfFile path: String) { 
    let data = NSData(contentsOfURL: NSURL(string: path)!) 
    self.init(data: data!) 
} 

convenience override init?(data: NSData) { 
    self.init(data: data, scale: 1.0) 
} 

override init?(data: NSData, scale: CGFloat) { 
    var imgSource = CGImageSourceCreateWithData(data, nil) 


    super.init(data: data, scale: scale) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

required convenience init(imageLiteral name: String) { 
    fatalError("init(imageLiteral:) has not been implemented") 
} 
} 



class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let path = NSBundle.mainBundle().URLForResource("1", withExtension: "gif")?.absoluteString as String! 
    let test = LCGIFImage(contentsOfFile: path) 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
} 
+0

let path = NSBundle.mainBundle() pathForResource ("1", ofType: "gif"). –

+0

@LeoDabus Merci. Mais, le problème n'est pas avec le chemin. Il est capable de localiser le fichier gif. C'est avec la fonction 'CGImageSourceCreateWithData' qui continue à me donner l'avertissement': impossible de charger des informations de classe Objective-C. Cela réduira de manière significative la qualité des informations de type disponibles. – iamktothed

Répondre

1

Avez-vous regardé la pile trace de votre accident? J'ai essayé votre code et le problème semble être que les initialiseurs sont appelés récursivement.

enter image description here

Vous appelez super.init(data: data, scale: scale), qui appelle ensuite self.init(data: data), qui appelle votre initialiseur pratique, qui appelle ensuite votre initialiseur désigné, et celui-ci appelle à nouveau super.init(data: data, scale: scale).

Pour être honnête, je ne sous-classe pas UIImage, il y a beaucoup de pont (qui implique très probablement la magie) à CGImageRef impliqué sous le capot. Si vous insistez sur le sous-classement UIImage faire votre appel initialiseur désigné super.init(data: data) au lieu de super.init(data: data, scale: scale)

+0

Cela a fonctionné. Cependant, ce qui me déroutait, c'est que le même modèle d'initialisation avait fonctionné dans Swift 1.2, iOS 8, Xcode 6. En outre, corrigez-moi si je me trompe mais que l'UIImage n'a pas d'initialiseur désigné? Si c'est le cas, [commodit init delegate across alors qu'il est désigné inits delegate upwards] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097 -CH18-ID216). Si c'est le cas, le modèle init que je suivais ne devrait pas tomber dans un modèle récursif. – iamktothed