Search code examples
iosxcode11swift5

UITextField to change API URL in Swift 5


I am new iOS Developer

I want to change the websiteLogo API with a textfield to change the URL.

how can I change the line with the *** with a var and a textfield in my viewcontroller?

With screenshoot it's will be easier to understand what I want? Thank you !!! Guys. OneDriveLink. 1drv.ms/u/s!AsBvdkER6lq7klAqQMW9jOWQkzfl?e=fyqOeN

private init() {}
**private static var pictureUrl = URL(string: "https://logo.clearbit.com/:http://www.rds.ca")!**

private var task: URLSessionDataTask?

func getQuote(callback: @escaping (Bool, imageLogo?) -> Void) {

    let session = URLSession(configuration: .default)
        task?.cancel()

    task = session.dataTask(with: QuoteService.pictureUrl) { (data, response, error) in
            DispatchQueue.main.async {

                guard let data = data, error == nil else {
                callback(false, nil)
                return
                }

                guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
                callback(false, nil)
                return
                }

                let quote = imageLogo(image: data)
                    callback(true, quote)
                    print(data)
                }
        }
    task?.resume()
    }

Solution

  • First, please don't use screenshots do show your code. If you want help, others typically copy/paste your code to check whats wrong with it.

    There are some minor issues with your code. Some hints from me:

    1. Start your types with a big letter, like ImageLogo not imageLogo:
    2. Avoid statics
    3. Avoid singletons (they are almost statics)
    4. Hand in the pictureUrl into getQuote
    struct ImageLogo {
        var image:Data
    }
    
    class QuoteService {
        private var task: URLSessionDataTask?
    
        func getQuote(from pictureUrl:URL, callback: @escaping (Bool, ImageLogo?) -> Void) {
            let session = URLSession(configuration: .default)
            task?.cancel()
    
            task = session.dataTask(with: pictureUrl) { 
                (data, response, error) in
                DispatchQueue.main.async {
                    guard let data = data, error == nil else {
                        callback(false, nil)
                        return
                    }
    
                    guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
                        callback(false, nil)
                        return
                    }
    
                    let quote = ImageLogo(image: data)
                    callback(true, quote)
                    print(data)
                  }
            }
            task?.resume()
        }
    }
    
    
    1. Store an instance of QuoteService in your view controller
    2. Call getQuote on that instance, handing in the pictureUrl
    class ViewController : UIViewController {
        var quoteService:QuoteService!
    
        override func viewDidLoad() {
            self.quoteService = QuoteService()
        }
    
        func toggleActivityIndicator(shown:Bool) { /* ... */ }
        func update(quote:ImageLogo) { /* ... */ }
        func presentAlert() { /* ... */ }
    
        func updateconcept() {
              guard let url = URL(string:textField.text!) else {
                  print ("invalid url")
                  return
              }
              toggleActivityIndicator(shown:true)
              quoteService.getQuote(from:url) {
                  (success, quote) in
                  self.toggleActivityIndicator(shown:false)
                  if success, let quote = quote {
                        self.update(quote:quote)
                  } else {
                      self.presentAlert()
                  }
              }
        }
    
        /* ... */
    
    }
    

    Hope it helps.