2015-04-17 9 views
7

मैं सफलतापूर्वक अपना मौसम ऐप काम करने में सक्षम हूं; वर्तमान परीक्षण डेटा और आगे प्रदर्शित करना। लेकिन अब एकमात्र मुद्दा यह है कि मैं केवल ऐप को अपने "ताज़ा करें" बटन दबाकर डेटा लाने के लिए प्राप्त कर सकता हूं। जब मैं खोला जाता हूं तो मैं अपना ऐप यूआई अपडेट कैसे कर सकता हूं? लेकिन सब कुछ मैं या तो कोशिश:ऐप खोले जाने पर ऑटो अपडेट यूआई

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() 

} 
    } 

क्या मैं देख रहा था AppDelegate.swift फ़ाइल और इसकी समारोह में बनाया "applicationDidEnterBackground समारोह (UIApplication आवेदन)" का उपयोग करने का कहना है:

यहाँ मेरे कार्य कोड है ऐप तोड़ता है या सिर्फ काम नहीं करता है। मैं ऐप को getTemp फ़ंक्शन चलाता हूं, ह्यूमिड फ़ंक्शन प्राप्त करता हूं और उसके बाद UI से अद्यतन करता हूं जैसे मैंने बटन से IBAction फ़ंक्शंस में किया था।

किसी भी मदद की बहुत सराहना की जाती है।

संपादित करें:

// 
// 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) 
    } 
} 

दूसरा समाधान जोड़ने का प्रयास किया गया, deinit साथ चलाने के लिए सक्षम नहीं था()।

उत्तर

3

प्रत्येक बार खोले जाने पर कुछ करने के लिए ऐप प्राप्त करने के लिए मानक चाल एनएसयूसर में पहली बार डिस्प्ले को स्टोर करने के लिए है और फिर ऐप खोले जाने पर वर्तमान दिनांक के विरुद्ध संग्रहीत दिनांक की जांच करने के लिए है। यदि पर्याप्त समय बीत चुका है, तो आप कार्य करते हैं, अन्यथा आप नहीं करते हैं। यदि आप कार्य करते हैं, तो आप एक नई अवधि शुरू करने के लिए वर्तमान तारीख को एनएसयूसर डीफॉल्ट में वापस स्टोर करते हैं।

2

1 समाधान: आप अपने viewcontroller में, उस के लिए सूचनाओं का उपयोग कर सकते हैं viewDidLoad से जोड़ें: viewController को

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

और एक नया कार्य:

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

    getHumid() 
    getTemp() 

} 

2 समाधान: viewDidLoad में वैकल्पिक रूप से

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

दोनों मामलों में आपको denit ओवरराइड करने की आवश्यकता होगी (यह दृश्य नियंत्रक को हटाए जाने पर अवलोकन को रोकता है।

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

इनमें से कोई भी समाधान काम नहीं करता है। मुझे यकीन नहीं है कि क्यों, वे संकलित करते हैं लेकिन ऐप डेटा खींच नहीं पाता है और न ही इसे प्रदर्शित करता है। कोई अन्य विचार? – MicrosoftDave

+0

वे निश्चित रूप से काम करते हैं .. कुछ और गलत होना चाहिए। आपको पहले समाधान में ब्लॉक के लिए 'println (' कुछ लॉग informtaion ') डालने का प्रयास करना चाहिए या दूसरे समाधान में 'appWasOpened' फ़ंक्शन को जांचने का प्रयास करना चाहिए ताकि उन्हें कॉल किया जा सके या नहीं। इसके अतिरिक्त आप अपने 'viewWillAppear' विधि' के लिए 'self.appWasOpened (nil)' पर कॉल नहीं कर सकते हैं। –

+0

मैं डेनिट को ओवरराइड कहां से करूं? मैंने AppDelegate में देखा और ViewController – MicrosoftDave

संबंधित मुद्दे