2012-03-16 32 views
5

Tôi đang cố gắng sử dụng NSUserdefaults để lưu một số dữ liệu từ một trường văn bản, tôi muốn nó được lưu lại khi ứng dụng thoát và nạp khi ứng dụng bắt đầu, tuy nhiên tôi đã chạy vào tường. Các phương pháp mà tôi muốn sử dụng là tất cả trong AppDelegate, Bây giờ tôi không hiểu cách sử dụng AppDelegate rất tốt, tôi đã nghĩ về hai cách có thể để đạt được điều này, tôi không có ý tưởng nếu nó sẽ làm việc mặc dù.Làm thế nào để sử dụng NSUserDefaults với AppDelegate

  1. nhập appdelegate và hơn đi xe phương pháp bên trong VC tôi HOẶC
  2. tạo một thể hiện của VC tôi trong appdelegate và cho phép appdelegate để thiết lập và lấy nội dung của UITextField của tôi - (Đừng này đi ngược lại MVC mô?)

Bất kỳ lời đề nghị sẽ đánh giá cao

Cảm ơn bạn rất nhiều vì thời gian của bạn

Trả lời

2

Như bạn đã đề cập ở trên, bạn có hai tùy chọn:

1-) Trực tiếp truy cập vào số UITextField của VC từ các phương thức applicationDidFinishLaunchingapplicationWillTerminate của VC.

On applicationDidFinishLaunching:

đọc từ NSUserDefaults, thiết UITextField trong VC.

On applicationWillTerminate:

đọc từ UITextField trong VC, thiết NSUserDefaultssynchronize.

2) Tạo các phương thức thích hợp trong VC để thực hiện cùng một công việc và gọi chúng từ AppDelegate.

-(void)record 
{ 
// Read from UITextField, set UserDefaults and synchonize. 
} 

-(void)restore 
{ 
// Read from UserDefaults, set UITextField. 
} 
+0

Cảm ơn bạn đã nhập, phương pháp thứ 2 có vẻ dễ dàng hơn nhiều đối với tôi lol. nhưng không nhập khẩu VC của tôi vào AppDelegate được coi là xấu? hoặc là nó được phép? Vì tôi chưa kết nối VC của tôi với AppDelegate, có vẻ như không thể tìm ra cách làm thế nào hoặc tôi chỉ cần tạo một cá thể. – user1214037

+0

Nếu đó là VC duy nhất của bạn, nó đã được rootViewController truy cập theo mặc định. Bạn có thể gọi chúng trong AppDelegate như sau: [self.rootViewController record]; – erkanyildiz

+0

Nó là một trong nhiều :). Tôi đang sử dụng một bảng phân cảnh, tôi cũng đã xóa một orignal để sử dụng một bộ điều khiển điều hướng. – user1214037

1

Tôi khuyên bạn chỉ nên đăng ký một số thông báo UIApplication trong lớp con của bạn và trả lời chúng một cách thích hợp. Đây là liên kết tới tài liệu UIApplication. Các thông báo bạn có thể đăng ký được liệt kê ở cuối trang.

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html

Dưới đây là một ví dụ về những gì bạn có thể làm trong lớp con của bạn:

[[NSNotificationCenter defaultCenter] addObserver:self 
             Selector:@selector(restore) 
              name:UIApplicationDidFinishLaunchingNotification 
              object :nil]; 

Đừng quên để loại bỏ bản thân như một người quan sát là tốt. Có rất nhiều hướng dẫn trực tuyến nếu bạn không cảm thấy thoải mái với NSNotifications.

0

Chắc chắn được phép có App Delegate giữ tham chiếu đến chuỗi điều khiển chế độ xem. Ví dụ và mẫu ứng dụng iOS của Apple thường đặt con trỏ tới trình điều khiển chế độ xem gốc trong biến phiên bản App Delegate.

Nếu chuỗi bộ điều khiển chế độ xem không bị hỏng, một khả năng là để App Delegate gửi thông báo "cleanUpNow" tới bộ điều khiển xem trên cùng hoặc gốc, và có bộ điều khiển chế độ xem vượt qua chuỗi đó, với mọi bộ điều khiển xem dọn dẹp khi cần thiết và sau đó gửi lại tin nhắn tới tất cả các bộ điều khiển khác ở xa chuỗi để dọn dẹp.

Việc truy cập trực tiếp vào một bộ điều khiển chế độ xem khác có thể kém rõ ràng hơn khi gửi thư để dọn sạch chính nó (ghi vào NSDefaults, v.v.). Có lẽ họ có tất cả tin nhắn một đối tượng điều khiển "làm sạch" trung tâm có mục đích là thu thập tất cả các trạng thái cần thiết và viết nó ra trong một đoạn mạch lạc.

Nếu chuỗi bị hỏng, một tùy chọn khác là App Delegate gửi thông báo, với bất kỳ bộ điều khiển cần thiết để dọn dẹp các trình xử lý đăng ký cho thông báo "dọn sạch" đó.

3

Thay vì giữ trường văn bản trong AppDelegate của bạn, hãy giữ văn bản. Tôi muốn làm như sau:

1) Trong AppDelegate.h:

@property (strong, nonatomic) NSString *textToBeSaved; 

2) Trong AppDelegate.m, đọc và viết textToBeSaved để NSUserDefaults khi ra mắt ứng dụng của bạn và kết thúc. Mở mắt:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
self.textToBeSaved = [defaults objectForKey:@"save_me"]; 

và, trước khi chấm dứt:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setValue:self.textToBeSaved forKey:@"save_me"]; 
BOOL success = [defaults synchronize]; 

3) Trong SomeViewController.m mà tự nhiên sở hữu UITextField, trong viewWillAppear:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
myTextField.text = appDelegate.textToBeSaved; 

4) Khi bạn thiết lập textToBeSaved phụ thuộc vào giao diện người dùng của bạn, nhưng bất cứ khi nào bạn biết văn bản đã sẵn sàng (nói trên textFieldShouldReturn hoặc shouldEndEditing), bạn có thể giao chuỗi cho AppDelegate:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
appDelegate.textToBeSaved = myTextField.text; 

Nếu không có giao diện người dùng để cho phép người dùng chấp nhận văn bản, bạn có thể lưu chuỗi trên (textField: shouldChangeCharactersInRange: replaceString).

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