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
Trả lời
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:
.
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
Để 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.
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.
- 1. Làm cách nào để xóa giá trị mặc định của người dùng trong NSUserDefaults?
- 2. Cách xóa giá trị đăng ký trong C#
- 3. Làm cách nào để phát hiện một hàm JavaScript có chữ ký nào đó đã được đăng ký?
- 4. Hủy đăng ký cuộc gọi lại đã đăng ký qua register_callback()?
- 5. Làm cách nào để hủy đăng ký chức năng đã đăng ký trong loại trực tiếp?
- 6. Java7 PropertyEditors đã đăng ký qua ThreadGroupContext
- 7. Xóa NSUserDefaults
- 8. WiX: Làm cách nào để ngăn chặn giá trị đăng ký bị xóa khi gỡ cài đặt?
- 9. Sau khi rõ ràng, localStorage nhớ giá trị trước đó
- 10. Xóa các cookie đã lưu trước đó khỏi Cơ chế
- 11. Làm cách nào để nhận được IObservable để đẩy giá trị mới nhất khi đăng ký
- 12. Đã cố đăng ký tiện ích với id == valores0 nhưng id đó đã được đăng ký
- 13. Trong UNIX, cách tìm người dùng đã đăng nhập hôm qua hoặc trước đó
- 14. Nhận giá trị trước đó của ComboBox
- 15. Làm cách nào để chọn hiệu quả giá trị không null trước đó?
- 16. Làm cách nào để xóa bảy ký tự cuối cùng của giá trị băm trong Perl?
- 17. Cách đăng ký mặc định người dùng bằng NSUserDefaults mà không ghi đè giá trị hiện tại?
- 18. NSUserDefaults chứa giá trị hay không?
- 19. Làm cách nào để nhận khóa trước đó từ SortedDictionary?
- 20. Đăng giá trị null qua AJAX
- 21. Làm cách nào để xóa các giá trị khỏi QMap?
- 22. WPF: Làm cách nào để đăng ký thêm các trình biến đổi giá trị tiềm ẩn?
- 23. Tại sao sử dụng registerDefaults: thay vì setValue: forKey :?
- 24. Các khóa/giá trị đăng ký ẩn
- 25. Emacs mở lại bộ đệm đã bị xóa trước đó?
- 26. Làm cách nào để kiểm tra với NSUserDefaults?
- 27. Lấy Giá trị của Khóa Đăng ký
- 28. Làm cách nào để khôi phục Phân đoạn đã hiển thị trước đó?
- 29. xóa thẻ CVS đã được tạo trước đó
- 30. Cách kiểm tra giá trị đăng ký bằng VbScript
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