2010-09-09 25 views
6

Tôi có nhiều giá trị ưu tiên được đăng ký qua [NSUserDefaults registerDefaults:] gọi khi khởi động ứng dụng. Tôi cần phải thay thế chúng ở một số giai đoạn với những cái mới nhưng phạm vi giá trị mới (phím được đặt) nhỏ hơn giá trị ban đầu. Vì vậy, sau khi tôi gọi lại số [NSUserDefaults registerDefaults:], tôi có các giá trị mới với một số giá trị cũ không được thay thế. Có khả năng xóa các giá trị đã đăng ký trước đó không?Làm cách nào để xóa giá trị đã đăng ký trước đó qua [NSUserDefaults registerDefaults:] gọi

+0

Nếu bạn đang làm việc trên iOS, tài liệu (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html) đề cập đến " Nội dung của miền đăng ký không được ghi vào đĩa, bạn cần phải gọi phương thức này mỗi khi ứng dụng của bạn bắt đầu.Bạn có thể đặt một tệp plist trong thư mục Resources của ứng dụng và gọi registerDefaults: với nội dung mà bạn đã đọc từ tệp đó. " Vì vậy, tôi cho rằng, nếu bạn bỏ chúng ra, chúng sẽ bị bỏ trống. Bạn có bất kỳ ý tưởng tại sao các giá trị cũ còn lại trong mặc định? – Nick

Trả lời

0

Bạn có thể sử dụng removeVolatileDomainForName: để xóa NSRegistrationDomain. Thao tác này sẽ xóa tất cả các giá trị đã đăng ký qua registerDefaults:. Nhưng nếu bạn cần làm điều này, bạn có thể làm điều gì đó sai trái. Cách đúng là lưu trữ các cài đặt mới bằng một trong các phương thức set...:forKey:.

+0

Giải pháp này sẽ không khắc phục được sự cố của tôi do removeVolatileDomainForName hoạt động ở cấp độ + 1 so với mặc định – macwasik

12

Để thay thế hoàn toàn giá trị mặc định đã đăng ký, bạn sẽ thay thế miền NSRegistrationDomain (điều này dễ bay hơi, nhân tiện).

Để xóa các giá trị mặc định đã đăng ký riêng lẻ, bạn nhận được các giá trị trong NSRegistrationDomain, xóa (các) khóa vi phạm và thay thế tên miền.

Một loại trên NSUserDefaults có thể trông như thế này:

@implementation NSUserDefaults (UnRegisterDefaults) 

- (void)unregisterDefaultForKey:(NSString *)defaultName { 
    NSDictionary *registeredDefaults = [[NSUserDefaults standardUserDefaults] volatileDomainForName:NSRegistrationDomain]; 
    if ([registeredDefaults objectForKey:defaultName] != nil) { 
     NSMutableDictionary *mutableCopy = [NSMutableDictionary dictionaryWithDictionary:registeredDefaults]; 
     [mutableCopy removeObjectForKey:defaultName]; 
     [self replaceRegisteredDefaults:[mutableCopy copy]]; 
    } 
} 

- (void)replaceRegisteredDefaults:(NSDictionary *)dictionary { 
    [[NSUserDefaults standardUserDefaults] setVolatileDomain:dictionary forName:NSRegistrationDomain]; 
} 

@end 

Động lực:

Lý do tôi cần điều này là vì tôi muốn turn on user-agent spoofing (vì lý do tương thích của bên thứ 3). Giả mạo tác nhân người dùng chỉ xuất hiện để hoạt động khi giá trị được đặt qua registerDefaults:, vì vậy set...:forKey: sẽ không dừng chuỗi tác nhân người dùng đó. Nếu tôi muốn ngừng giả mạo tác nhân người dùng một thời gian sau đó (mà không cần khởi động lại ứng dụng), tôi cần một cách để xóa các giá trị mặc định. Hơn nữa, tôi không muốn xóa người khác đăng ký mặc định người dùng ứng dụng của tôi. Các giải pháp trên xuất hiện để thực hiện điều này một cách hoàn hảo.

+0

Tình cờ gặp vấn đề tương tự. Cảm ơn! – jklp

+0

Công cụ tuyệt vời. Bạn nên đặt nó trên GitHub. Cảm ơn! – Dennis

1

Swift 3 cảng câu trả lời ban EthanB của:

extension UserDefaults { 
    /// Unregisters a value set in the UserDefaults.registrationDomain, if it exists 
    func unregister(defaultsFor key: String) { 
     var registeredDefaults = volatileDomain(forName: UserDefaults.registrationDomain) 
     registeredDefaults[key] = nil 
     setVolatileDomain(registeredDefaults, forName: UserDefaults.registrationDomain) 
    } 
} 

Được sử dụng trong deinit của UIWebView tôi để khôi phục lại các tác nhân người dùng mặc định trở lại ứng dụng của tôi.

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