无法从 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 = imageIllustrativeDefinitionViewController 上显示为灰色 提示:以 // 开头的行是 cmets,即使它们包含有效代码。 【参考方案1】:

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

改变

// definitionIllustrationImageView.image = imageIllustrative

definitionIllustrationImageView.image = imageIllustrative

【讨论】:

我做了,还是不显示图片 它有有效的尺寸吗?在调试控制台中键入“po definitionIllustrationImageView.image.size”,在此行添加断点并运行您的应用程序。当它停止时,将光标悬停在“definitionIllustrationImageView.image”上。它会显示预览吗?

以上是关于无法从 wikipedia API 恢复图像并将其显示在另一个视图控制器中的主要内容,如果未能解决你的问题,请参考以下文章

如何从API加载图像并将其保存到sqlite数据库中?

从 Wikipedia 检索数据并使用 angularjs 显示它

Android:无法从mysql数据库中检索图像URL并将其显示在imageView中

恢复用户图像后,如何将其保存在 Drawable 中

使用 Wikipedia API 获取图像 URL,但有些图像不返回 URL,为啥?

PHP Twitter API 无法获取georss:point 并将其存储为变量?