2017-10-23 10 views
0

저장 방법은 이미 알고 있으며 앱을 열 때 자동으로로드 할 수 있습니다. 그러나 나는 그것을 닫을 때 어떻게 그들을 구할 지 모른다! 나는 지금 버튼을 가지고있다. 하나의 값인 StreakNumber 만 저장하려고합니다. 그러나 내가 시도 할 때마다 나는 실패한다.앱 종료시 데이터 저장하기

응용 프로그램 대리인 인 경우 ViewController.AppSave(ViewController)이라고 말하면됩니다. 나는 오류 얻을 :

Editor placeholder in source file Expression resolves to an unused function

을 내가 ViewController.AppSave() 를 사용하는 경우 나는 다음과 같은 오류가 발생합니다 :

Instance member 'SaveApp' cannot be used on type 'ViewController'; did you mean to use a value of this type instead?

import UIKit 
import UserNotifications 

class ViewController: UIViewController { 
    //TEST PLAY AREA// 

    @IBAction func SaveButton(_ sender: Any) { 
     SaveApp() 
    } 

    @IBAction func LoadButton(_ sender: Any) { 
     LoadApp() 
    } 

    ///TEST PLAY AREA ENDS 
    public var streakNumber = 0 
    public var streakNumberString = "" 

    public var activated = false 

    let defaults = UserDefaults.standard 
    //Labels 
    @IBOutlet var streakNumberLabel: UILabel! 

    @IBOutlet var remainingTimeTextLabel: UILabel! 

    @IBOutlet var remainingTimeNumberLabel: UILabel! 
    //Buttons 
    @IBAction func startButton(_ sender: Any) { 
     Activate() 

    } 
    @IBAction func stopButton(_ sender: Any) { 
     Deactivate() 
     seconds = 59 
     minutes = 59 
     hours = 47 

    } 

    //Timer 
    var timer = Timer() 
    var seconds = 0 
    var minutes = 0 
    var hours = 0 

    // Nitifications 
    //END 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     LoadApp() 

     // this enables notifications 
     UNUserNotificationCenter.current().requestAuthorization(options:[.alert , .sound , .badge], completionHandler:{ didAllow, error in 
     }) 
    } 

    func Activate(){ 
     if activated == false { 
      streakNumber += 1 

     } 
     activated = true 
     streakNumberLabel.text = String(streakNumber) 
    } 

    func Deactivate(){ 
     if activated == true{ 
      activated = false 
      ActivTimer() 

      // Notification 
      let content = UNMutableNotificationContent() 
      content.title = " 10 secodns are up " 
      content.subtitle = " yep time passed" 
      content.body = " The 10 seconds are really up!!" 
      content.badge = 1 
      let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 600, repeats:false) 
      let request = UNNotificationRequest(identifier: "timerDone", content: content , trigger: trigger) 
      UNUserNotificationCenter.current().add(request,withCompletionHandler:nil) 
     } 
    } 

    @objc func Clock(){ 
     seconds = seconds-1 
     if seconds == -1{ 
      seconds = 59 
      minutes = minutes-1 
     } 
     if minutes == -1{ 
      minutes = 59 
      hours = hours-1 
     } 
     remainingTimeNumberLabel.text = (String(hours) + ":" + String(minutes) + ":" + String(seconds)) 
     if seconds == 0 && hours == 0 && minutes == 0 { 

      timer.invalidate() 

     } 
    } 

    func ActivTimer(){ 
     timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.Clock), userInfo: nil, repeats: true) 
    }//SAVING STUFF DOESNT WORK 
    // 

    func SaveApp(){ 
     streakNumberString = String(streakNumber) 
     defaults.set(streakNumberString, forKey: "streakNumbers") 
     print("Saved" + String(defaults.integer(forKey: "streakNumbers"))) 

    } 

    func LoadApp(){ 
     streakNumberString = defaults.string(forKey: "streakNumbers")! 
     print (defaults.integer(forKey: "streakNumbers")) 
     streakNumber = Int(streakNumberString)! 
     streakNumberLabel.text = String(streakNumber) 
    }// 
} 
+0

appdidEnterBackground & willEnterforeground가 가장 좋습니다. 살펴보기 1. https://stackoverflow.com/questions/9011868/whats-the-best-way-to-detect-when-the-app-isenterating-the-background-for-my-vie 2. https://stackoverflow.com/questions/9599431/is-there-any-notification-to-get-before-application-did-enter-background 3. https://stackoverflow.com/questions/9039606/refresh- 전경 입력 후 데이터 4. https://stackoverflow.com/questions/10648388/ios-app-applicationwillenterforeground-and-it-stucked-for-a-while –

+0

게시 한 대부분의 코드에는 아무 것도 없습니다. 오류를 일으키는 코드와 관련이 있습니다. 질문을 편집하여 관련 코드를 포함 시키십시오. 문제의 원인이되는 실제 코드를 포함 시키십시오. – rmaddy

답변

0

오류가 모든 것을 말한다. ViewControllerSaveApp()을 호출 할 수 없습니다. SaveApp()을 호출하려면 실제로 ViewController의 인스턴스가 필요합니다.

당신이 응용 프로그램 종료에 데이터를 저장하여 ViewController 인스턴스를 원하는 경우, 당신은 종료 전에뿐만 아니라 응용 프로그램이 최소화 될 때마다 호출되고 AppDelegateapplicationDidEnterBackground 방법에서 알림 게시 할 수있는 :

func applicationDidEnterBackground(_ application: UIApplication) { 

    NotificationCenter.default.post(Notification(name: Notification.Name("AppAboutToTerminateOrMinimize"))) 
} 

그런 다음에 그 통지를 구독 할 수 있습니다 귀하의 ViewControllerviewDidLoad() :

NotificationCenter.default.addObserver(self, 
             selector: #selector(AppSave), 
             name: Notification.Name("AppAboutToTerminateOrMinimize"), 
             object: nil) 

또는 rmaddy 주석에서 언급 한 바와 같이 S, 그냥 AppDelegate 부분 ViewControllerviewDidLoad()에 아래 코드를 삽입하고 건너 뛸 수 있습니다 : 응용 프로그램이/최소화 AppDelegate 통지를 보내드립니다 종료

NotificationCenter.default.addObserver(self, 
             selector: #selector(AppSave), 
             name: Notification(name: UIApplicationDidEnterBackgroundNotification, 
             object: nil) 

이 방법의 ViewController 인스턴스 (살아있는 경우)가 나타납니다 IT 및 AppSave()

를 호출합니다 당신은 AppSave() 방법 @objc

에 주석을해야 할 것 그리고 그것은 속성과 메소드/즉 0123의 명명에 대한 lowerCamelCase를 사용하는 것이 좋습니다입니다대신 AppSave()

+0

이렇게하는 것이 훨씬 더 좋은 방법입니다. 뷰 컨트롤러에'UIApplicationDidEnterBackground' 알림을 등록하기 만하면됩니다. 맞춤 알림이 필요 없습니다. 'applicationDidEnterBackground' 앱 대리자 메소드에 아무 것도 게시 할 필요가 없습니다. – rmaddy

+0

@rmaddy 수정하십시오! 그게 내 마음에 오지 않았다 :) – Dan

+0

@rmaddy 어떻게 그렇게합니까? –