I am getting data from json web services but unable to display it on my ui

巧了我就是萌 提交于 2019-12-31 05:27:09

问题


here I am having problem that I am able to get the data from json web services but unable to display on my ui in the program I mentioned where I am getting error and what it is also mentioned there can anyone help me ?

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
            }
        }
    }

回答1:


what you are using to display image in func swiped(gesture: UIGestureRecognizer) method execution is as below

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

but your image is comping from the server so you just need to display all images of your product is as you displayed first in OperationQueue.main.addOperation so in place of displaying image using UIImage(named: imageArray[pageIndex]) you need to convert it to data and display it to imageview and your modified func swiped(gesture: UIGestureRecognizer) may look like as below

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
            }
        }
    }


来源:https://stackoverflow.com/questions/44082366/i-am-getting-data-from-json-web-services-but-unable-to-display-it-on-my-ui

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!