我有一个应用程序,该应用程序从Wikipedia API获取数据,并将其显示在另一个视图控制器中。具体来说,它会显示在文本字段中键入的关键字的摘录/定义(在文本视图中显示),并且还应显示用于说明该关键字的图像维基百科。
我的问题是文本数据显示在新的视图控制器中,而不显示在图像中。
由于我的应用程序相对较短,所以让我显示两个视图控制器的完整代码。
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
}
}
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
to
definitionIllustrationImageView.image = imageIllustrative