2016-03-29 3 views
0

Я сделал приложение, которое должно получить данные с веб-сайта и отобразить его на этикетке, когда пользователь нажмет кнопку.Button not refreshing data

Мои вопросы:

  1. при нажатии на кнопку в первый раз, он получает данные и показывает его

  2. , но если я снова нажмите на кнопку отображает те же данные, вместо обновленных данных.

Вот отрывок из того, что я сделал:

import UIKit 
import Osmosis 

class ViewController: UIViewController { 

    @IBOutlet weak var quote: UILabel! // My label supposed to display data 

    @IBOutlet weak var refreshButtonContent: UIButton! // My button 

    var array: [[String: AnyObject]] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     self.quote.text = "No Data yet" // Initate my label 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    /* The following function gets the data contain in a div on a website 
    and displays the data in the label 
    */ 

    func getQuotes() { 

     var updateText: String = "" 

     Osmosis(errorHandler: { (error) -> Void in 
      dispatch_async(dispatch_get_main_queue()) { 
       self.quote.text = "Error 500." 
      } 
      print(error) 
     }) 
      .get(NSURL(string: "http://www.exemple.com")!) 
      .find(OsmosisSelector(selector: ".wrapper"), type: .CSS) 
      .populate([ 
       OsmosisPopulateKey.Single("div") : OsmosisSelector(selector: ".div") 
       ], type: .CSS) 
      .list { (dict) -> Void in 
       self.array.append(dict) 

       // Cast self.array[0] to String 
       updateText = self.array[0]["div"] as! String 



      // Truncate the string to remove unwanted /n /t 
      updateText.removeAtIndex(updateText.startIndex) 
      updateText.removeAtIndex(updateText.startIndex) 
      updateText.removeAtIndex(updateText.endIndex.predecessor()) 

       print(updateText) 
       //Update UI by the main thread (to avoid slow display update) 
       dispatch_async(dispatch_get_main_queue()) { 
        self.quote.text = updateText 
       } 
      } 
      .start() 
    } 

    // Actions made when the button is pressed 

    @IBAction func refreshButton(sender: AnyObject) { 

     getQuotes() 
     refreshButtonContent.setTitle("Refresh Data", forState: .Normal) 
    } 

} 

Что такое ошибка я сделал и как я могу решить эту проблему?

+0

Что вас больше всего сработает? ваша последняя строка кода выполняет описанное вами поведение, кнопка всегда будет показывать один и тот же текст. – heximal

+0

Он вызвал 'self.quote.text = updateText' на 2-ом нажатии ?. Попробуйте распечатать обновленный текст и полученные данные, чтобы увидеть, совпадают ли они или нет. – Tj3n

+0

@ Tj3n. По-видимому, данные отличаются от «updatedText» на втором нажатии и после. Я не понимаю, почему, поскольку я нажимаю кнопку, я вызываю 'getQuotes' (который содержит' self.quote.text = updateText'). Поэтому я полагаю, что каждый раз, когда я нажимаю кнопку, обновленный текст должен быть установлен на данные. – Mehdi

ответ

1

Вы добавляете dict в self.array, но затем вы всегда получаете доступ к первому элементу в self.array. Здесь: updateText = self.array[0]["div"] as! String

Таким образом, его «всегда» будет работать при первом запуске (при условии, что что-то существует в индексе 0), но оно не будет «работать» на последующих прогонах, потому что индекс не поддерживает нажатие кнопки. Вы должны либо заменить содержимое self.array, либо просто не использовать массив или использовать индекс, который обновлен с количеством раз, когда вы нажали кнопку.

Вам нужен массив где-то еще в коде? Почему бы не просто сделать self.quote.text = dict["div"] as! String

+0

Я установил' updatedText = self.array [0] ["div"] as! String', потому что мне нужно усечь строку. Я обновил свой код, чтобы вы поняли, почему я использую 'updatedText' – Mehdi

+0

@Mehdi. Вы все равно обращаетесь к одному элементу массива каждый раз. –

+0

Спасибо за ваше объяснение, теперь я понимаю свою ошибку. Есть ли способ всегда обращаться к последнему элементу моего массива? – Mehdi