2012-02-29 34 views
7

Tôi có một đối tượng ở gốc của plist lưu trữ các đối tượng và khóa (một trong số đó là đầu vào từ một trường văn bản người dùng). Tôi không có vấn đề về viết và tạo cấu trúc; nó đang cố đọc các giá trị gây ra sự cố. Dưới đây mã tôi sử dụng để ghi dữ liệu, ai đó có thể cho tôi biết làm thế nào để đọc chuỗi [val] và [myKey]?Cách đọc chuỗi từ NSUserDefaults

cảm ơn bạn!

#define defaultValue @"Your Name" 
#define myKey @"PersonName" 

- (void)textFieldAction:(id)sender { 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *val; 

    // Get the new value from the textfield 

    val = [myTextField stringValue]; 

    if ([val isEqualToString:defaultValue]) { 
     [defaults removeObjectForKey:myKey]; 
    } else { 
     // [defaults setObject:val forKey:myKey]; 

    NSDictionary *my_dict = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"Name", @"PersonName", 
          @"Email", @"PersonEmail", 
          @"Dept", @"PersonDept", 
          @"Job", @"PersonJob", 
          val, myKey, 
          @"Status", @"PersonStatus", 
          nil]; 

    [defaults setObject: my_dict forKey: @"Person"]; 

    [[NSUserDefaults standardUserDefaults] registerDefaults:my_dict]; 

Tôi muốn tự động cư textfield với [val], cho [MyKey], nếu người dùng có các thông tin đã có trong plist. Dưới đây là đoạn code tôi đang cố gắng để sử dụng cho rằng:

- (void)applicationDidFinishLaunching:(NSNotification *)notification { 

    NSUserDefaults *defaults = [[NSUserDefaults standardUserDefaults] objectForKey:myKey]; 
    NSString *val = [defaults stringForKey:myKey]; 

    if (val == nil) val = defaultValue; 
    [myTextField setStringValue:val]; 
+0

Mã này có thực sự biên dịch không? – sch

+0

heh. vâng, nó không có vấn đề gì, nó không phải là xấu, phải không? :-p – Devon

+0

Đây không phải là ứng dụng iOS, đó là OS X. – Devon

Trả lời

30

Bạn có thể ghi giá trị vào NSUserDefault như sau:

[[NSUserDefaults standardUserDefaults] setValue:[myTextField stringValue] forKey:@"Person"]; 

Và đọc nó sau này như sau:

[myTextField setStringValue:[[NSUserDefaults standardUserDefaults] stringForKey:@"Person"]; 

Vì vậy, bạn có thể đơn giản hóa mã của bạn vào:

- (void)textFieldAction:(id)sender { 
    [[NSUserDefaults standardUserDefaults] setValue:[myTextField stringValue] forKey:@"Person"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Và khi bạn có thể lấy giá trị mà chỉ đơn giản bằng cách gọi:

- (void)applicationDidFinishLaunching:(NSNotification *)notification 
{ 
    // ... 
    NSString *value = [[NSUserDefaults standardUserDefaults] stringForKey:@"Person"]; 
    if (value == nil) value = defaultValue; 
    [myTextField setStringValue:value]; 
    // ... 
} 
+0

Tuyệt vời, cảm ơn bạn đã thay đổi nó ;-) - tôi sẽ thử ngay bây giờ. – Devon

+0

Nó không giống như .text - Tôi nhận được một lỗi "tài sản" văn bản 'không tìm thấy trên đối tượng của loại NSTextField *' – Devon

+0

Vâng, tôi đã thay đổi thành 'setStringValue' khi bạn nói nó không phải là một ứng dụng iOS :) – sch

2

Nếu tôi hiểu đúng, bạn sẽ có thể làm những gì bạn cần bằng cách đơn giản thực hiện:

NSString * val = [[NSUserDefaults standardUserDefaults] objectForKey: myKey]; 
[textfield setText: val]; 

NSUserDefaults Reference Page

+0

Nó xuất ra defaultValue "Your Name" trong Textfield mà tôi đã định nghĩa ở trên, tuy nhiên, nếu người đó trước đây đã nhập tên của họ, nó sẽ đọc nó và điền vào trường văn bản với thông tin đó. Thật không may nó luôn luôn kết quả đầu ra "Tên của bạn", do đó, nó rõ ràng là không nhận được đọc một cách chính xác, bởi vì tên được lưu trữ trong plist. – Devon

+0

Rất khó có thể đọc nó không chính xác vì chức năng của nó là trực tiếp từ khung công tác. Nó có nhiều khả năng là bạn đang thiết lập nó không chính xác. Thật khó để nói vì mã bạn đăng là rõ ràng không phải là toàn bộ mã - nó thậm chí còn không biên dịch. Đoán của tôi là bạn đang thực sự đặt giá trị hai lần - trước tiên bằng [mặc định setObject ...] và sau đó bằng cách đăng ký từ điển. Bạn chỉ nên làm điều đó một lần. –

+0

Xin lỗi, tôi đã đăng toàn bộ mã nếu điều đó hữu ích. cảm ơn bạn! – Devon

1
myTextField.text = [[NSUSerDefaults standardUserDefaults] objectForKey:myKey]; 
Các vấn đề liên quan