2016-07-21 16 views
6

Tôi muốn gọi hàm có tên cập nhật mỗi lần người dùng nhấn vào biểu tượng ứng dụng của tôi và mở nó. Tôi sẽ làm như thế nào? Phương pháp nào mà tôi có thể ghi đè lên bất cứ khi nào ứng dụng khởi chạy không có vấn đề gì bị giết từ nền hoặc người dùng nhấn nút home.Cách gọi hàm mỗi lần người dùng mở ứng dụng

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var label: UILabel! 

    @IBOutlet weak var button: UIButton! 

    @IBOutlet weak var labeltwo: UILabel! 

    var NSDateDefalt = NSUserDefaults.standardUserDefaults() 
    var date : NSDate? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     date = NSUserDefaults.standardUserDefaults().objectForKey("yourKey") as? NSDate 
     label.text = "\(date)" 
     update() 
    } 


    @IBAction func buttona(sender: AnyObject) { 
     date = NSDate() 
     label.text = "\(date)" 

     NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey:"yourKey") 
    } 



    func update(){ 
     let now = NSDate() 
     let seconds = now.timeIntervalSinceDate(date!) 
     labeltwo.text = "\(seconds))" 
    } 

} 

Cập nhật: Tôi thực hiện trong tôi App Đại biểu

func applicationWillEnterForeground(application: UIApplication) { 
     ViewController().update()  
    } 
+0

Bạn nên gọi nó từ 'didFinishLaunchingWithOptions' nếu bạn muốn gọi nó khi ứng dụng khởi chạy. Nếu bạn muốn gọi nó khi ứng dụng đến ở nền trước từ chế độ nền thì bạn nên gọi nó từ 'applicationWillEnterForeground'. – Lion

+2

Liên kết đến Vòng đời ứng dụng - https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html – Khundragpan

+0

gọi phương thức của bạn từ phương thức applicationWillEnterForeground. –

Trả lời

10

Bạn cần phải thực hiện logic của bạn trong appdelegate

class AppDelegate: UIResponder, UIApplicationDelegate { 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 

     // first launch 
     // this method is called only on first launch when app was closed/killed 
     return true 
    } 

    func applicationWillEnterForeground(application: UIApplication) { 

     // app will enter in foreground 
     // this method is called on first launch when app was closed/killed and every time app is reopened or change status from background to foreground (ex. mobile call) 
    } 

    func applicationDidBecomeActive(application: UIApplication) { 

     // app becomes active 
     // this method is called on first launch when app was closed/killed and every time app is reopened or change status from background to foreground (ex. mobile call) 
    } 
} 

Cập nhật

Như Paulw11 gợi ý, xem xét sử dụng applicationWillEnterForeground thay vì applicationDidBecomeActive

+4

'applicationWillEnterForeground' có lẽ là lựa chọn tốt hơn' applicationDidBecomeActive' - ứng dụng sẽ trở thành không hoạt động/hoạt động khi hộp thoại hệ thống như trung tâm điều khiển hoặc hộp thoại cấp quyền được hiển thị – Paulw11

+0

Cảm ơn bạn rất nhiều vì đã giúp đỡ. bạn có biết tại sao khi tôi thực hiện phương thức trong ủy nhiệm ứng dụng, var date: NSDate! Thông báo cảnh báo: giá trị này tìm thấy nil trong khi mở một giá trị Tùy chọn. – Joe

+0

Bạn đang khai báo ngày là NSDate! Vì vậy, bạn phải chắc chắn rằng khi bạn sử dụng biến này giá trị của nó không phải là nil (có thể bạn quên đặt giá trị previusly?). Nếu không khai báo ngày: NSDate? nếu nó có thể là nil và thêm '?' trước phương thức (ví dụ: date? .compare (anotherDate)). Phụ thuộc vào những gì bạn muốn làm. – lubilis

5

Trong AppDelegate.swift của bạn, có didFinishLaunchingWithOptionsapplicationWillEnterForeground.

applicationWillEnterForeground tương tự như viewWillAppear cho chế độ xem của bạnTrình điều khiển ngược với ứng dụng của bạn, trong khi didFinishLaunchingWithOptions tương tự như viewDidLoad cho ứng dụng của bạn. Để biết thêm thông tin, hãy kiểm tra UIApplicationDelegate

2

Sử dụng thông báo UIApplicationDidBecomeActive.

+0

Sẽ được gọi ngay cả khi người dùng mở đóng trung tâm điều khiển. –

+0

'applicationWillEnterForeground' có lẽ là lựa chọn tốt hơn' applicationDidBecomeActive' - ứng dụng sẽ trở nên không hoạt động khi một hộp thoại hệ thống như trung tâm điều khiển hoặc hộp thoại cho phép được hiển thị – Paulw11

0

Khi ứng dụng ở chấm dứt tuyên bố và sử dụng vòi nước trên ứng dụng biểu tượng phương thức đầu tiên được gọi là

didFinishLaunchingWithOptions 

và khi ứng dụng trong chế độ background và foreground đến

applicationWillEnterForeground 

do đó, u có thể gọi Cập nhật() trong cả hai method.But khi Phương pháp gọi bằng didFinishLaunchingWithOptions không gọi trong applicationWillEnterForeground.Because khi ứng dụng khởi động cả hai phương pháp được gọi và khi ứng dụng nhập vào chế độ nền trước chỉ gọi phương thức WillEnterForeground. Điều này có thể quản lý bằng bool cờ

3

Trong ViewController.swift trong viewDidLoad() viết một trong những theo cách tương ứng:

NotificationCenter.default.addObserver(self, selector: #selector(self.update), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil) 
NotificationCenter.default.addObserver(self, selector: #selector(self.update), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) 

(EDIT: cập nhật cho Swift 3)

(EDIT: phần loại bỏ của bài viết này iOS không tự động kích hoạt các thông báo này cho bất kỳ người quan sát nào khác, không cần thêm mã để kích hoạt chúng trong App Delegate)

+1

Không, không! Các thông báo này được đăng bởi iOS và không được đăng bởi bạn. Mã của bạn sẽ kích hoạt thông báo bổ sung. – ullstrm

+0

Công trình này hoạt động nhưng không cần thiết. iOS sẽ kích hoạt thông báo bạn đang đăng trong AppDelegate. Bạn chỉ cần viewController của bạn để trở thành một người quan sát thông báo. Vì vậy, viết trong 'viewWillAppear' của ViewController bạn muốn cập nhật như sau:' NotificationCenter.default.addObserver (self, selector: #selector (self.update), tên: NSNotification.Name.UIApplicationWillEnterForeground, object: nil) '. Khá dễ. –

+0

Tôi đã quan sát thấy chúng cũng bị sa thải bất kể bạn đang điều khiển bộ điều khiển nào. Đặt nó trên 1 đi khác, đóng ứng dụng, mở ứng dụng và quan sát sẽ bắn cho bộ điều khiển khác. –

Các vấn đề liên quan