2015-04-17 9 views
7

Ich konnte erfolgreich meine Wetter App arbeiten; Anzeigen der aktuellen Testdaten und so weiter. Aber das einzige Problem ist jetzt, dass ich die App nur dazu bringen kann, die Daten zu holen, indem ich meinen "Refresh" -Button drücke, den ich gemacht habe. Wie kann ich meine App aktualisieren, wenn sie geöffnet wird?Auto Update UI wenn App geöffnet ist

Hier ist mein Arbeitscode:

import Foundation 
import UIKit 




class ViewController: UIViewController { 
@IBOutlet weak var tempLabel: UILabel! 
@IBOutlet weak var humidLabel: UILabel! 
@IBOutlet weak var refresh: UIButton! 
@IBOutlet weak var negitiveSymbol: UILabel! 


func getTemp(){ 
    var urlString = "http://torsher.ca/Weather/temperature.txt" 
    var url = NSURL(string: urlString) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 15.0)){(data, response, error) in 
     var urlContent = (NSString(data: data, encoding: NSUTF8StringEncoding)) 
     var tempContent:String = urlContent as String 
     println(tempContent) 

     dispatch_async(dispatch_get_main_queue()) { 
      self.tempLabel.text = (tempContent) 

     } 
    } 

    task.resume() 
} 

func getHumid(){ 
    var urlString = "http://torsher.ca/Weather/humidity.txt" 
    var url = NSURL(string: urlString) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 15.0)){(data, response, error) in 
     var urlContent = (NSString(data: data, encoding: NSUTF8StringEncoding)) 
     var humidContent:String = urlContent as String 
     println(humidContent) 

     dispatch_async(dispatch_get_main_queue()) { 
      self.humidLabel.text = (humidContent) 
     } 
    } 

    task.resume() 
} 


@IBAction func refreshPressed(sender: AnyObject, forEvent event: UIEvent) { 
    getTemp() 

} 
@IBAction func refreshPress(sender: AnyObject, forEvent event: UIEvent) { 
    getHumid() 
} 



     override func viewDidLoad() { 
     super.viewDidLoad() 

} 
    } 

Was bei sagt, ich war auf der Suche die AppDelegate.swift Datei und ihre eingebauten func „Func applicationDidEnterBackground (Anwendung: UIApplication)“ zu verwenden, aber alles, was ich entweder versuchen, bricht die App oder funktioniert einfach nicht. Ich möchte, dass die App die getTemp-Funktion, die getHumid-Funktion ausführt und dann die Benutzeroberfläche mit den Werten aktualisiert, die ich in den IBAction-Funktionen über die Schaltflächen eingegeben habe.

Jede Hilfe wird sehr geschätzt.

EDIT:

// 
// ViewController.swift 
// WeatherStation 
// 
// Created by on 2015-04-16. 
// Copyright (c) 2015 . All rights reserved. 
// 

import Foundation 
import UIKit 




class ViewController: UIViewController { 
@IBOutlet weak var tempLabel: UILabel! 
@IBOutlet weak var humidLabel: UILabel! 
@IBOutlet weak var refresh: UIButton! 
@IBOutlet weak var negitiveSymbol: UILabel! 
@IBOutlet weak var dateUpdate: UILabel! 


func getTemp() //Gets the temeprature from the server and displays it. 
{ 
    var urlString = "http://torsher.ca/Weather/temperature.txt" 
    var url = NSURL(string: urlString) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 15.0)){(data, response, error) in 
     var urlContent = (NSString(data: data, encoding: NSUTF8StringEncoding)) 
     var tempContent:String = urlContent as String 
     println(tempContent) 

     dispatch_async(dispatch_get_main_queue()) { 
      self.tempLabel.text = (tempContent) 

     } 
    } 

    task.resume() 
} 

func getHumid() //Gets the humidity from the server and displays it. 
{ 
    var urlString = "http://torsher.ca/Weather/humidity.txt" 
    var url = NSURL(string: urlString) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 15.0)){(data, response, error) in 
     var urlContent = (NSString(data: data, encoding: NSUTF8StringEncoding)) 
     var humidContent:String = urlContent as String 
     println(humidContent) 

     dispatch_async(dispatch_get_main_queue()) { 
      self.humidLabel.text = (humidContent) 
     } 
    } 

    task.resume() 
} 


@IBAction func refreshPressed(sender: AnyObject, forEvent event: UIEvent) //Updates UI with current temperature when refresh is pressed. 
{ 
    getTemp() 
} 

@IBAction func refreshPress(sender: AnyObject, forEvent event: UIEvent) //Updates UI with current humidity when refresh is pressed. 
{ 
    getHumid() 
} 

func appWasOpened(notification: NSNotification!) 
{ 
    getHumid() 
    getTemp() 
} 

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(foregroundNotification) 
} 


override func viewDidLoad() 
{ 
super.viewDidLoad() 
NSNotificationCenter.defaultCenter().addObserver(self, selector:   
"appWasOpened:", name: UIApplicationWillEnterForegroundNotification, object:   
nil) 
    } 
} 

Versuchte die zweite Lösung das Hinzufügen, war nicht in der Lage mit deinit laufen().

Antwort

3

Der Standardtrick, um eine App bei jedem Öffnen zu öffnen, besteht darin, beim ersten Öffnen der App ein Datum in NSUserDefaults zu speichern und das gespeicherte Datum beim erneuten Öffnen der App mit dem aktuellen Datum zu vergleichen. Wenn genug Zeit vergangen ist, machst du die Tat, sonst tust du es nicht. Wenn Sie die Aufgabe ausführen, speichern Sie das aktuelle Datum in NSUserDefaults, um einen neuen Zeitraum zu beginnen.

2

1. Lösung: Sie können die Benachrichtigungen verwenden für, dass in Ihrem viewcontroller fügen Sie diese viewDidLoad:

NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue()) 
{ [unowned self] notification in 

    getHumid() 
    getTemp() 

} 

2. Lösung: alternativ in viewDidLoad:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "appWasOpened:", name: UIApplicationWillEnterForegroundNotification, object: nil) 

und eine neue Funktion der viewController

func appWasOpened(notification: NSNotification!) 
{ 
    getHumid() 
    getTemp() 
} 

In beiden Fällen müssen Sie denit überschreiben (dies verhindert, dass die Beobachtungen aufgerufen werden, wenn der Viewcontroller freigegeben wird.

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 
+0

Keine dieser Lösungen scheint zu funktionieren. Ich bin nicht sicher, warum, sie kompilieren, aber die App nicht die Daten ziehen noch zeigt es an. Irgendwelche anderen Ideen? – MicrosoftDave

+0

sie funktionieren sicher .. es muss etwas anderes schief gehen. Sie sollten versuchen, eine 'println ('einige Protokollinformationen') 'entweder auf den Block in der ersten Lösung oder die' appWasOpened'-Funktion in der zweiten Lösung zu setzen, um zu überprüfen, ob sie aufgerufen werden. Zusätzlich können Sie einen Aufruf von 'self.appWasOpened (nil)' an Ihre 'viewWillAppear'-Methode senden. –

+0

Wo überschreibe ich Deinit? Ich probierte in AppDelegate und ViewController – MicrosoftDave

Verwandte Themen