我正在从 json Web 服务获取数据,但无法在我的 ui 上显示它

Posted

技术标签:

【中文标题】我正在从 json Web 服务获取数据,但无法在我的 ui 上显示它【英文标题】:I am getting data from json web services but unable to display it on my ui 【发布时间】:2017-05-20 05:42:41 【问题描述】:

在这里我遇到了问题,我能够从 json Web 服务获取数据,但无法在我提到的程序中的 ui 上显示我收到错误的地方以及那里也提到的内容,有人可以帮助我吗?

class DetailsViewController: UIPageViewController

    @IBOutlet var navigationBar: UINavigationBar!
    @IBOutlet var imageView: UIImageView!
    @IBOutlet var pageControl: UIPageControl!
    @IBOutlet var nameLabel: UILabel!
    @IBOutlet var priceLabel: UILabel!
    @IBOutlet var textview: UITextView!

    var productName :String?
    var productprice :String?
    var productdescription :String?
    var thumbnailimageArray = [String]()
    var imageArray = [String]()
    var pageIndex: Int = 0


let urlString = "http://www.json-generator.com/api/json/get/cjpberBhKa?indent=2"

    override func viewDidLoad() 
        super.viewDidLoad()
        self.downloadJsonWithURL()
        let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
        swipeLeft.direction = .left
        self.imageView.addGestureRecognizer(swipeLeft) //unexpectely found nil while unwrapping an optional value
        let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
        swipeRight.direction = .right
        self.imageView.addGestureRecognizer(swipeRight)
        imageView.isUserInteractionEnabled = true
        pageControl.numberOfPages = imageArray.count
        pageControl.currentPage = pageIndex
        // Do any additional setup after loading the view.
    
    func downloadJsonWithURL() 
        let url = NSURL(string: urlString)
        URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: (data, response, error) -> Void in
            if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary 
                print(jsonObj!.value(forKey: "Detail")!)
                if let detailsArray = jsonObj!.value(forKey: "Detail") as? NSArray 
                    if let detailDict = detailsArray[0] as? NSDictionary 
                        if let name = detailDict.value(forKey: "productName") 
                            self.productName = name as? String
                        
                        if let image1 = detailDict.value(forKey: "image1")
                            self.imageArray.append(image1 as! String)
                        
                        if let image2 = detailDict.value(forKey: "image2")
                            self.imageArray.append(image2 as! String)
                        
                        if let image3 = detailDict.value(forKey: "image3")
                            self.imageArray.append(image3 as! String)
                        
                        if let image4 = detailDict.value(forKey: "image4")
                            self.imageArray.append(image4 as! String)
                        
                        if let image5 = detailDict.value(forKey: "image5")
                            self.imageArray.append(image5 as! String)
                        
                        if let image6 = detailDict.value(forKey: "image6")
                            self.imageArray.append(image6 as! String)
                        
                        if let image7 = detailDict.value(forKey: "image7")
                            self.imageArray.append(image7 as! String)
                        
                        if let image8 = detailDict.value(forKey: "image8")
                            self.imageArray.append(image8 as! String)
                        
                        if let image9 = detailDict.value(forKey: "image9")
                            self.imageArray.append(image9 as! String)
                        
                        if let image10 = detailDict.value(forKey: "image10")
                            self.imageArray.append(image10 as! String)
                        
                        if let price = detailDict.value(forKey: "productPrice") 
                            self.productprice = price as? String
                        
                        if let description = detailDict.value(forKey: "productDes") 
                            self.productdescription = description as? String
                        
                    
                
                OperationQueue.main.addOperation(
                    self.navigationBar.topItem?.title = self.productName
                    self.textview.text = self.productdescription
                    self.priceLabel.text = self.productprice
                    print(self.imageArray)
                    let imgURL = NSURL(string:self.imageArray[0])
                    let data = NSData(contentsOf: (imgURL as URL?)!)
                    self.imageView.image = UIImage(data: data! as Data)
                )
            
        ).resume()
    
    func swiped(gesture: UIGestureRecognizer) 
        if let swipeGesture = gesture as? UISwipeGestureRecognizer 
            switch swipeGesture.direction 
            case UISwipeGestureRecognizerDirection.right :
                if pageIndex == 0 

                else
                    pageIndex -= 1
                
                imageView.image = UIImage(named: imageArray[pageIndex])
            case UISwipeGestureRecognizerDirection.left:
                if pageIndex >= imageArray.count-1

                else
                    pageIndex += 1
                
                imageView.image = UIImage(named: imageArray[pageIndex])
            default:
                break
            
        
    

【问题讨论】:

错误是什么?? self.imageView.addGestureRecognizer(swipeLeft) 上设置断点,然后检查 imageView 是否为 nil。如果是这种情况,请正确连接插座。 @bilal self.imageView.addGestureRecognizer(swipeLeft) 在这里我收到错误,即在展开可选值时意外发现 nil 滑动时发生崩溃?? 没有第二个视图控制器没有加载@bilal 【参考方案1】:

您在func swiped(gesture: UIGestureRecognizer)方法执行中使用的显示图像如下

imageView.image = UIImage(named: imageArray[pageIndex])

但是您的图片来自服务器,因此您只需要显示您产品的所有图片,就像您首先在 OperationQueue.main.addOperation 中显示的那样,因此您需要将其转换为数据并显示,而不是使用 UIImage(named: imageArray[pageIndex]) 显示图片它到 imageview 和您修改的 func swiped(gesture: UIGestureRecognizer) 可能如下所示

func swiped(gesture: UIGestureRecognizer) 
        if let swipeGesture = gesture as? UISwipeGestureRecognizer 
            switch swipeGesture.direction 
            case UISwipeGestureRecognizerDirection.right :
                if pageIndex == 0 

                else
                    pageIndex -= 1
                
                let imgURL = NSURL(string:self.imageArray[pageIndex])
                let data = NSData(contentsOf: (imgURL as URL?)!)
                self.imageView.image = UIImage(data: data! as Data)

            case UISwipeGestureRecognizerDirection.left:
                if pageIndex >= imageArray.count-1

                else
                    pageIndex += 1
                
                let imgURL = NSURL(string:self.imageArray[pageIndex])
                let data = NSData(contentsOf: (imgURL as URL?)!)
                self.imageView.image = UIImage(data: data! as Data)
            default:
                break
            
        
    

【讨论】:

以上是关于我正在从 json Web 服务获取数据,但无法在我的 ui 上显示它的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 jquery 从 Web API 获取 JSON 响应

我无法从 JSON 获取数据并且没有错误

Prestashop Web 服务返回 JSON

无法将JSON数据访问到角度(.ts)文件中

无法解析从 iOS 中的 PHP 获取的 JSON

无法从外部本地 json 获取数据