2014-11-03 18 views
11

Tôi cần chuyển một biến từ AppDelegate sang một lớp khác mà tôi đã tạo để giữ các biến toàn cầu của dự án và tôi không thể tìm cách làm cho nó hoạt động.Swift Truyền dữ liệu từ appDelegate sang lớp khác

Đây là mã trong appdelegate:

func application(application: UIApplication!, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!) { 
    println("Device's token is: \(deviceToken)") 

    //Global Variables Class Instance 
    let globals:Globals = Globals() 

    globals.setDeviceToken("test1") //method1 not working 
    globals.deviceToken = "test2" //method2 not working 
} 

Đây là Globals Lớp tôi:

public class Globals { 
    var deviceToken = String() 

    init() { 
     //nothing 
    } 

    func setDeviceToken(s:String){ 
     deviceToken = s 
    } 

    func getDeviceToken() -> String { 
     return deviceToken 
    } 
} 

Nếu tôi cố gắng để in các giá trị, từ các tập tin khác của dự án, tôi không thể lấy bất cứ thứ gì, chỉ là một chuỗi rỗng.

class ViewController: UIViewController { 

    //Global Variables Class Instance 
    let globals:Globals = Globals() 

    override func viewDidLoad() { 
     println(globals.getDeviceToken()) //return empty string 
     println(globals.deviceToken)  //return empty string 

*** UPDATE: Đối với những người đã bỏ phiếu cho câu hỏi của tôi: Cảm ơn bạn rất nhiều. Xin lỗi nếu tôi không phải là một chuyên gia của Swift (chưa) và xin lỗi nếu tôi đang sử dụng stackoverflow để hỏi một cái gì đó tôi không biết!

+0

Cần có bao nhiêu dữ liệu trong ứng dụng được ủy quyền? KHÔNG AI! KHÔNG BAO GIỜ! Đừng làm thế. Nó không phải là những gì ứng cử viên được cho. – Fogmeister

+6

Không cần phải lo lắng, tôi chỉ là người mới bắt đầu và tôi đang cố gắng học. @Fogmeister – MeV

Trả lời

14

Có một số mẫu mà bạn có thể sử dụng để đạt được những gì bạn muốn

  1. Bạn có thể truy cập vào appdelegate qua UIApplication:

    let delegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let deviceToken = delegate.deviceToken 
    
  2. Nhìn vào độc thân. Tìm kiếm nhanh trên google cho 'Swift singleton' sẽ giúp bạn có một chặng đường dài. Kết quả đầu tiên:

    class SingletonB { 
    
         class var sharedInstance : SingletonB { 
         struct Static { 
          static let instance : SingletonB = SingletonB() 
         } 
         return Static.instance 
        } 
    } 
    

Sau đó sử dụng sharedInstance để nhanh chóng các singleton bất cứ nơi nào và truy cập vào các biến tương tự.

Đầu tiên nhanh chóng và dơ bẩn, vì vậy đối với các dự án nghiêm túc hơn, tôi muốn giới thiệu mẫu đơn.

Có lẽ là một triệu cách để làm điều này, nhưng điều này sẽ giúp bạn bắt đầu

(Xem thêm tại liên kết này, mà tìm hiểu một số cách để thực hiện độc thân: https://github.com/hpique/SwiftSingleton)

+0

Cảm ơn bạn đã trả lời. Tôi chưa bao giờ sử dụng singleton và cần đọc một số tài liệu về nó. Nhưng mã trông rất giống với mã tôi đang sử dụng cho [email protected] Vork – MeV

+0

singleton chỉ là tuyệt vời !!!!! CẢM ƠN!!!!!! @Bob Vork – MeV

+0

Như được ghi trong bài viết được liên kết, cách tạo phức tạp ở trên khá phức tạp là không cần thiết nếu bạn đang sử dụng Swift 1.2 hoặc mới hơn. – RenniePet

6

Tôi chỉ đơn giản là giải quyết vấn đề của tôi sử dụng NSUserDefaults

trong appdelegate:

NSUserDefaults.standardUserDefaults().setObject(deviceToken, forKey: "deviceToken") 
NSUserDefaults.standardUserDefaults().synchronize() 

Từ các lớp khác:

NSUserDefaults.standardUserDefaults().objectForKey("deviceToken") 

Thành thật mà nói tôi không biết nếu điều này là một cách tốt để làm điều đó nhưng nó làm việc

*** UPDATE: Đối với những ai đã bỏ phiếu xuống câu hỏi của tôi: Cảm ơn bạn rất nhiều. Xin lỗi nếu tôi không phải là một chuyên gia của Swift (chưa) và xin lỗi nếu tôi đang sử dụng stackoverflow để hỏi một cái gì đó tôi không biết!

+0

hi! Tôi muốn biết tại sao không nên sử dụng NSUserDefaults? – mattyU

+0

mattyU bạn cần hỏi @Fogmeister ở đây, vì anh ấy đã nhận xét câu hỏi của tôi – MeV

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