Как я могу удалить значение, которое было ранее зарегистрировано через вызов [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: методы.

Другие вопросы по тегам