2016-03-29 3 views
0

ウェブサイトからデータを取得し、ユーザーがボタンをクリックするとラベルに表示するはずのアプリを作った。ボタンがデータをリフレッシュしない

私の問題は、次のとおりです。

  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

2回目のプレスで 'self.quote.text = updateText'を呼び出しましたか? updatedTextと受信したデータを印刷して、同じかどうかを確認してください。 – Tj3n

+0

@ Tj3n明らかに、データは2回目以降の 'updatedText'とは異なります。なぜ私はボタンを押すたびに 'getQuotes'(' self.quote.text = updatedText'を含む)を呼び出しているのか理解できません。ですから、ボタンを押すたびに、updatedTextをデータに設定する必要があります。 – Mehdi

答えて

1

dictself.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"]を次のように設定しました!私は文字列を切り捨てることができる必要があります。私は 'updatedText'をなぜ使用するのかを見せるためにコードを更新しました – Mehdi

+0

@Mehdiあなたは毎回同じ配列要素にアクセスしています。 –

+0

あなたの説明をありがとう、今私は間違いを理解する。配列の最後の要素に常にアクセスする方法はありますか? – Mehdi

関連する問題