无法从维基百科API恢复图像并将其显示在另一个视图控制器中



我有一个应用程序,可以从维基百科API获取数据并将其显示在另一个视图控制器中。具体来说,它显示UITextField中键入的关键字的摘录/定义(显示在文本视图中(,并且还应该显示维基百科用于说明该关键字的图像。

我的问题是文本数据显示在新的视图控制器中,而不是图像中。

由于我的应用程序相对较短,因此让我显示两个视图控制器的完整代码。

  1. 首先是视图控制器的代码,它通过HTTP调用从维基百科获取信息
import Alamofire
import SwiftyJSON
import SDWebImage // me permet d'ajouter une image venant de wikipedia pour illustrer mon paragraphe recherché
class ViewController: UIViewController {
@IBOutlet weak var textEntryLabel: UITextField!
@IBOutlet weak var segueButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
//darkMode()
// on appelle la fonction qui gere les couleurs alternatives lorsque dark mode est detecté
if traitCollection.userInterfaceStyle == .dark {
darkMode()
}
}
//MARK: - Relevant variables
let wikipediaURl = "https://en.wikipedia.org/w/api.php"
var termDefinitionInfo: String = ""
var illustration = UIImageView()
let segueName: String = "toDefinition"
//MARK: - Button tapped action
@IBAction func buttonToDefinition(_ sender: UIButton) {
// on appelle la fonction ici
httpCall(termDefinition: textEntryLabel.text ?? "Nothing to verify")
}
//MARK: - handles what needs to be done prior to triggering the segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == segueName {
if let secondVC = segue.destination as? DefinitionViewController {
//secondVC.imageIllustrative = illustration.image
secondVC.definition = termDefinitionInfo
secondVC.imageIllustrative = illustration.image

} else {
fatalError("Could not perform request!")
}
}
}
//MARK: - NETWORKING
func httpCall(termDefinition: String) {
let parameters : [String:String] = [
"format" : "json",
"action" : "query",
"prop" : "extracts|pageimages",
"exintro" : "",
"explaintext" : "",
"titles" : termDefinition,
"indexpageids" : "",
"redirects" : "1",
"pithumbsize" : "250"
]
//
request(wikipediaURl, method: .get, parameters: parameters).responseJSON { (response) in
if response.result.isSuccess {
//1. on affiche le tableau json initial
let definitionJSON: JSON = JSON(response.result.value)
print(definitionJSON)
// 3 valeurs : pageID,definition et source de l'image
let pageId = definitionJSON["query"]["pageids"][0].stringValue
let pageDefinition = definitionJSON["query"]["pages"][pageId]["extract"].stringValue
let imageSource = definitionJSON["query"]["pages"][pageId]["thumbnail"]["source"].stringValue
//on attache ces valeurs extraites aux bonnes variables
self.illustration.sd_setImage(with: URL(string: imageSource))
self.termDefinitionInfo = pageDefinition

// cas ou on n'a pas de definition
if pageDefinition == "" {
self.termDefinitionInfo =  "Désolé,ce que vous cherchez ne se trouve pas sur Wikipedia"
}
// et on effectue le segue vers le second view controller ici
self.performSegue(withIdentifier: "toDefinition", sender: self)
print(self.termDefinitionInfo)
} else {
print("Error! Could not fetch data!")
}
}
}
//MARK: - FONCTION QUI GERE LES COULEURS POUR LE DARK MODE
func darkMode() {
//la couleur du texte de la barre de navigation ici blanc
navigationController?.navigationBar.tintColor = UIColor.white
// la couleur du text du placeholder ici bleu
textEntryLabel.attributedPlaceholder = NSAttributedString(string: "Saisir ici le terme à rechercher", attributes: [NSAttributedString.Key.foregroundColor: UIColor.systemBlue])
// la couleur du text
textEntryLabel.textColor = UIColor.label
//la couleur du texte du bouton ici blanc
segueButton.setTitleColor(UIColor.black, for: .normal)
//la couleur de fonds du bouton
segueButton.backgroundColor = UIColor.white
//la couleur de la bordure du bouton
segueButton.layer.borderColor = UIColor.white.cgColor
segueButton.layer.borderWidth = 1
}
}
  1. 这是第二个视图控制器(显示数据提取和图像(的代码
import SwiftyJSON
import Alamofire
import SDWebImage
class DefinitionViewController: UIViewController {
@IBOutlet weak var definitionIllustrationImageView: UIImageView!
@IBOutlet weak var definitionTextView: UITextView!

// on cree deux variables pour attacher l'image illustrative et la definition
var definition: String?
var imageIllustrative: UIImage?

override func viewDidLoad() {
super.viewDidLoad()
//definitionTextView.text = donnees
definitionTextView.text = definition
// definitionIllustrationImageView.image = imageIllustrative
// Do any additional setup after loading the view.
}

}

如果所有内容在 IB 中都正确连接,那么您只需要取消注释将图像分配给图像视图的代码:

改变

// definitionIllustrationImageView.image = imageIllustrative

definitionIllustrationImageView.image = imageIllustrative

最新更新