无法从 wikipedia API 恢复图像并将其显示在另一个视图控制器中
Posted
技术标签:
【中文标题】无法从 wikipedia API 恢复图像并将其显示在另一个视图控制器中【英文标题】:Unable to recover an image from wikipedia API and display it in another view controller 【发布时间】:2020-01-01 13:15:55 【问题描述】:我有一个从 Wikipedia API 获取数据并将其显示在另一个视图控制器中的应用程序。具体来说,它显示在 UITextField 中键入的关键字的提取/定义(它显示在文本视图中),并且还应该显示用于说明该关键字的***图像。
我的问题是文本数据显示在新的视图控制器中,而不是图像。
由于我的应用程序相对较短,让我展示两个视图控制器的完整代码。
-
首先是通过 HTTP 调用从 Wikipedia 获取信息的视图控制器的代码
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.
【问题讨论】:
看起来definitionIllustrationImageView.image = imageIllustrative
在DefinitionViewController
上显示为灰色
提示:以 // 开头的行是 cmets,即使它们包含有效代码。
【参考方案1】:
如果一切都在 IB 中正确连接,那么您只需取消注释将图像分配给图像视图的代码:
改变
// definitionIllustrationImageView.image = imageIllustrative
到
definitionIllustrationImageView.image = imageIllustrative
【讨论】:
我做了,还是不显示图片 它有有效的尺寸吗?在调试控制台中键入“po definitionIllustrationImageView.image.size”,在此行添加断点并运行您的应用程序。当它停止时,将光标悬停在“definitionIllustrationImageView.image”上。它会显示预览吗?以上是关于无法从 wikipedia API 恢复图像并将其显示在另一个视图控制器中的主要内容,如果未能解决你的问题,请参考以下文章
从 Wikipedia 检索数据并使用 angularjs 显示它
Android:无法从mysql数据库中检索图像URL并将其显示在imageView中