Alfi Alfi - 4 months ago 32
Swift Question

Can't Show images to iCarousel from web url

I Want to Show some images from a website on iCarousel SlideShow.

I get Empty Slideshow from iCarousel.

I'm beginner and tried many codes by chance on my app but noting happened

Here is my Complete code :

import UIKit

class ViewController: UIViewController , iCarouselDataSource, iCarouselDelegate {

@IBOutlet weak var imageView: UIImageView!

@IBOutlet weak var allimages: UIImageView!

internal var urll:NSURL!

@IBOutlet weak var carouselView: iCarousel!

var numbers = [Int]()
var urls = [String]()


func carousel(carousel: iCarousel, viewForItemAtIndex index: Int, reusingView view: UIView?) -> UIView {
let tempView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 200))

let images = UIButton(frame: CGRect(x: 0, y: 0, width: 300, height: 200))
images.backgroundColor = UIColor.blueColor()
images.backgroundImageForState(.Normal)
images.backgroundRectForBounds(CGRect(x: 0, y: 0, width: 300, height: 200))
tempView.addSubview(images)

let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
imageView.backgroundColor = UIColor.orangeColor()


for item in self.urls {
print (item)

let s = item
let url = NSURL(string: s)
let session = NSURLSession.sharedSession()
let task = session.downloadTaskWithURL(url!)
{
(url: NSURL?, res: NSURLResponse?, e: NSError?) in
let d = NSData(contentsOfURL: url!)
let image = UIImage(data: d!)

dispatch_async(dispatch_get_main_queue()) {
imageView.image = image
}
}
task.resume()
}

return images

}




func carousel(carousel: iCarousel, valueForOption option: iCarouselOption, withDefault value: CGFloat) -> CGFloat {
if option == iCarouselOption.Spacing {
return value * 1.1
}
return value
}

override func awakeFromNib() {
super.awakeFromNib()
numbers = [1,2,3,4]
}

func numberOfItemsInCarousel(carousel: iCarousel) -> Int {
return numbers.count
}

//==============================================================
override func viewDidLoad() {






carouselView.type = .Rotary
carouselView.autoscroll = 0.4
// let defaults = NSUserDefaults.standardUserDefaults()



urll = NSURL(string: "http://xxxxxxxxx.com/api/?slider=uij6sdnb")

let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(urll) {(NSData, response, error) -> Void in
do {
let records = try NSJSONSerialization.JSONObjectWithData(NSData!, options: NSJSONReadingOptions.MutableContainers) as! NSArray


for record in records {
let urlid = Int(record["slide_id"] as! String)
let urimage = record["slide_url"] as! String


print(urlid)
print(urimage)
self.urls = [urimage]
// print(self.urls.count)
}
}
catch {
print("Json Error")

}
}


task.resume()


Any help will appreciated.

Answer

Here is my Complete Code.

But as you see its for 4 image.

For more or less images, you can apply the changes easily.

I added the icrousel from jared Davinson Youtube Channel.

Enjoy.

 //
//  ViewController.swift
//  parniapharmed
//
//  Created by Alfredo Uzumaki on 2016 AP.
//  Copyright © 2016 AP Alfredo Uzumaki. All rights reserved.
//

import UIKit
import SystemConfiguration // for checking internet connection


class ViewController: UIViewController {  // if you had any problem. command this line and uncommand the below line !

//    class ViewController: UIViewController , iCarouselDataSource, iCarouselDelegate {



@IBOutlet weak var allimages: UIImageView!

internal var urll:NSURL!

@IBOutlet weak var carouselView: iCarousel!

@IBOutlet weak var img1: UIImageView!
@IBOutlet weak var img2: UIImageView!
@IBOutlet weak var img3: UIImageView!
@IBOutlet weak var img4: UIImageView!

@IBOutlet weak var allimagetop: UIView!

internal var imageNinja:String = ""

internal var hasInternet:Bool! // for checking internet connection

var numbers = [Int]()
var urls = [String]()

internal var urimage = [String]()

internal var image1:String = ""
internal var image2:String = ""
internal var image3:String = ""
internal var image4:String = ""

internal var imageArray: [UIImage] = []


func carousel(carousel: iCarousel, viewForItemAtIndex index: Int, reusingView view: UIView?) -> UIView {

    var tempView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 200))

    let images = UIButton(frame: CGRect(x: 0, y: 0, width: 300, height: 200))

    images.backgroundColor = UIColor.blueColor()
    images.backgroundImageForState(.Normal)
    images.backgroundRectForBounds(CGRect(x: 0, y: 0, width: 300, height: 200))

    tempView.addSubview(images)

    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 400, height: 200))
    imageView.image = UIImage(named: "loading")

    if (imageNinja != "") && (imageArray.count == 4) {  // Checking if images fully loaded you can Delete Seccond Condition if it Coused any Error

    imageView.backgroundColor = UIColor.orangeColor()
    imageView.image = imageArray[index]
    tempView.addSubview(imageView)
    }
    return imageView
}


func carousel(carousel: iCarousel, valueForOption option: iCarouselOption, withDefault value: CGFloat) -> CGFloat {
    if option ==  iCarouselOption.Spacing {
        return value * 1.1
    }
    return value
}

override func awakeFromNib() {
    super.awakeFromNib()
    numbers = [1,2,3,4] // i wrote it manualy but you can change it to: numbers = imageArray.count  or write the th numbers of your images.
}

func numberOfItemsInCarousel(carousel: iCarousel) -> Int {
    return numbers.count
}





//===========================Begin of View Did Load===================================


override func viewDidLoad() {

    carouselView.type = .Rotary
    carouselView.autoscroll = 0.1

    hasInternet = connectedToNetwork() //checking internet again !
    print(hasInternet) // if true then internet is ok

    if hasInternet == true {
    urll = NSURL(string: "http://yourwebsite.com/api/?slider=uij6sdnb") // <== put your php address here !!
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithURL(urll) {(data, response, error) -> Void in
        do {
            let records = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray
            for record in records {
                //slide_url is the subject of database row from php... change it to yours
                let urimage = record["slide_url"] as! String
                self.urls.append(urimage)
            }
            print(self.urls[2])
            self.image1 = self.urls[0]
            self.image2 = self.urls[1]
            self.image3 = self.urls[2]
            self.image4 = self.urls[3]
        }
        catch {
            print("Json Error")
        }

        while self.imageNinja == "" {
            self.image1 = self.urls[0]
            self.image2 = self.urls[1]
            self.image3 = self.urls[2]
            self.image4 = self.urls[3]
            print("4th image downloaded")
            print(self.image4)

           //----------------------------------- downoad image -----------------------------------------
            let url = NSURL(string: self.image1)
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
                let data = NSData(contentsOfURL: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check
                dispatch_async(dispatch_get_main_queue(), {
                    let image = UIImage(data: data!)
                    self.imageArray.append(image!)
                });
            }
            //----------------------------------- downoad image -----------------------------------------
            //----------------------------------- downoad image -----------------------------------------
            let url2 = NSURL(string: self.image2)
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
                let data = NSData(contentsOfURL: url2!) //make sure your image in this url does exist, otherwise unwrap in a if let check
                dispatch_async(dispatch_get_main_queue(), {
                    let image = UIImage(data: data!)
                    self.imageArray.append(image!)
                });
            }
            //----------------------------------- downoad image -----------------------------------------
            //----------------------------------- downoad image -----------------------------------------
            let url3 = NSURL(string: self.image3)
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
                let data = NSData(contentsOfURL: url3!) //make sure your image in this url does exist, otherwise unwrap in a if let check
                dispatch_async(dispatch_get_main_queue(), {
                    let image = UIImage(data: data!)
                    self.imageArray.append(image!)
                });
            }
            //----------------------------------- downoad image -----------------------------------------
            //----------------------------------- downoad image -----------------------------------------
            let url4 = NSURL(string: self.image4)
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
                let data = NSData(contentsOfURL: url4!) //make sure your image in this url does exist, otherwise unwrap in a if let check
                dispatch_async(dispatch_get_main_queue(), {
                    let image = UIImage(data: data!)
                    self.imageArray.append(image!)



                    print("imageArray Count is is :")
                    print(self.imageArray.count)
                    self.carouselView.reloadData()  //this one is do nothing! i put it for luck!
                });
            }
            //----------------------------------- downoad image -----------------------------------------

            self.imageNinja = "hhh"

        }

    }

    task.resume()

    }


    // ================================= end of view did load

}

// checking internet connection
func connectedToNetwork() -> Bool {
    var zeroAddress = sockaddr_in()
    zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
    zeroAddress.sin_family = sa_family_t(AF_INET)
    guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, {
        SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
    }) else {
        return false
    }
    var flags : SCNetworkReachabilityFlags = []

    if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == false {
        return false
    }
    let isReachable = flags.contains(.Reachable)
    let needsConnection = flags.contains(.ConnectionRequired)
    return (isReachable && !needsConnection)
}

}