Как я могу удалить значение, которое было ранее зарегистрировано через вызов [NSUserDefaults registerDefaults:]
У меня есть куча значений предпочтений, зарегистрированных через [NSUserDefaults registerDefaults:]
позвоните при запуске приложения. Мне нужно заменить их на каком-то этапе на новые, но область новых значений (набор ключей) меньше начальной. Итак, после того, как я позвоню [NSUserDefaults registerDefaults:]
снова у меня есть новые значения с некоторыми старыми, которые не были заменены. Есть ли возможность удалить ранее зарегистрированные значения?
3 ответа
Чтобы полностью заменить зарегистрированные значения по умолчанию, вы замените NSRegistrationDomain
домен (который, кстати, нестабилен).
Чтобы удалить отдельные зарегистрированные значения по умолчанию, вы получите значения в NSRegistrationDomain
, удалите оскорбительные ключи и замените домен.
Категория на NSUserDefaults
может выглядеть примерно так:
@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
Мотивация:
Причина, по которой мне это нужно, заключается в том, что я хочу включить подделку пользовательского агента (по соображениям совместимости со сторонними поставщиками). Подмена пользовательского агента, кажется, работает только тогда, когда значение установлено через registerDefaults:
, так set...:forKey:
не остановит строку user-agent. Если я хочу прекратить подмену пользовательского агента через некоторое время (без перезапуска приложения), мне нужен способ удалить настройки по умолчанию. Кроме того, я не хочу очищать других зарегистрированных по умолчанию пользователей моего приложения. Приведенное выше решение, по-видимому, позволяет достичь этого совершенно
Swift 3 порта оригинального ответа EthanB:
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)
}
}
Используется в deinit
из моего UIWebView
восстановить пользовательский агент по умолчанию обратно в мое приложение.
Ты можешь использовать removeVolatileDomainForName:
удалить NSRegistrationDomain
, Это очищает все значения, зарегистрированные через registerDefaults:
, Но если вам нужно сделать это, скорее всего, вы делаете что-то не так. Правильный способ - сохранить новые настройки, используя один из set...:forKey:
методы.